From 08dffb922a22916e4bf66355ed6191a1d60c0766 Mon Sep 17 00:00:00 2001 From: whowechina Date: Sun, 29 Jan 2023 20:52:17 +0800 Subject: [PATCH] Firmware moved to a separate repo --- FIRMWARE/FIRMWARE_v11_archive.zip | Bin 0 -> 24028 bytes FIRMWARE/Firmware.md | 2 + FIRMWARE/LICENSE | 674 ------------------------------ FIRMWARE/pico_sdk_import.cmake | 73 ---- FIRMWARE/src/CMakeLists.txt | 10 - FIRMWARE/src/buttons.c | 143 ------- FIRMWARE/src/buttons.h | 19 - FIRMWARE/src/main.c | 94 ----- FIRMWARE/src/rgb.c | 147 ------- FIRMWARE/src/rgb.h | 15 - FIRMWARE/src/tusb_config.h | 112 ----- FIRMWARE/src/usb_descriptors.c | 182 -------- FIRMWARE/src/usb_descriptors.h | 65 --- FIRMWARE/src/ws2812.pio | 85 ---- 14 files changed, 2 insertions(+), 1619 deletions(-) create mode 100644 FIRMWARE/FIRMWARE_v11_archive.zip create mode 100644 FIRMWARE/Firmware.md delete mode 100644 FIRMWARE/LICENSE delete mode 100644 FIRMWARE/pico_sdk_import.cmake delete mode 100644 FIRMWARE/src/CMakeLists.txt delete mode 100644 FIRMWARE/src/buttons.c delete mode 100644 FIRMWARE/src/buttons.h delete mode 100644 FIRMWARE/src/main.c delete mode 100644 FIRMWARE/src/rgb.c delete mode 100644 FIRMWARE/src/rgb.h delete mode 100644 FIRMWARE/src/tusb_config.h delete mode 100644 FIRMWARE/src/usb_descriptors.c delete mode 100644 FIRMWARE/src/usb_descriptors.h delete mode 100644 FIRMWARE/src/ws2812.pio diff --git a/FIRMWARE/FIRMWARE_v11_archive.zip b/FIRMWARE/FIRMWARE_v11_archive.zip new file mode 100644 index 0000000000000000000000000000000000000000..507f390e0767b0ecd63d0cd0b2c74cfedfd41b10 GIT binary patch literal 24028 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 - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/FIRMWARE/pico_sdk_import.cmake b/FIRMWARE/pico_sdk_import.cmake deleted file mode 100644 index 65f8a6f..0000000 --- a/FIRMWARE/pico_sdk_import.cmake +++ /dev/null @@ -1,73 +0,0 @@ -# This is a copy of /external/pico_sdk_import.cmake - -# This can be dropped into an external project to help locate this SDK -# It should be include()ed prior to project() - -if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) - set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) - message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") -endif () - -if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) - set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) - message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") -endif () - -if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) - set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) - message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") -endif () - -set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") -set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") -set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") - -if (NOT PICO_SDK_PATH) - if (PICO_SDK_FETCH_FROM_GIT) - include(FetchContent) - set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) - if (PICO_SDK_FETCH_FROM_GIT_PATH) - get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") - endif () - # GIT_SUBMODULES_RECURSE was added in 3.17 - if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0") - FetchContent_Declare( - pico_sdk - GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk - GIT_TAG master - GIT_SUBMODULES_RECURSE FALSE - ) - else () - FetchContent_Declare( - pico_sdk - GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk - GIT_TAG master - ) - endif () - - if (NOT pico_sdk) - message("Downloading Raspberry Pi Pico SDK") - FetchContent_Populate(pico_sdk) - set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) - endif () - set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) - else () - message(FATAL_ERROR - "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." - ) - endif () -endif () - -get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") -if (NOT EXISTS ${PICO_SDK_PATH}) - message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") -endif () - -set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) -if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) - message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") -endif () - -set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) - -include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/FIRMWARE/src/CMakeLists.txt b/FIRMWARE/src/CMakeLists.txt deleted file mode 100644 index 1c88e2b..0000000 --- a/FIRMWARE/src/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -add_executable(${PROJECT_NAME} main.c buttons.c rgb.c usb_descriptors.c) - -pico_generate_pio_header(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/ws2812.pio) -target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Werror -Wfatal-errors -O3) -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) -target_link_libraries(${PROJECT_NAME} PRIVATE - pico_multicore pico_stdlib hardware_pio tinyusb_device tinyusb_board) - -# Make a UF2 binary -pico_add_extra_outputs(${PROJECT_NAME}) diff --git a/FIRMWARE/src/buttons.c b/FIRMWARE/src/buttons.c deleted file mode 100644 index 1b864b0..0000000 --- a/FIRMWARE/src/buttons.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Pico Popn Controller Buttons - * WHowe - * - * A button consists of a switch and an LED - */ - -#include "buttons.h" - -#include -#include - -#include "hardware/gpio.h" -#include "hardware/timer.h" - -#include "rgb.h" - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static const struct button { - int8_t sw_gpio; - int8_t led_gpio; /* led related to the button */ -} BUTTON_DEFS[] = { - {0, 1}, - {2, 3}, - {4, 5}, - {6, 7}, - {8, 9}, - {10, 11}, - {12, 13}, - {14, 15}, - {16, 17}, - {26, -1}, - {27, 25} -}; - -#define BUTTON_NUM (ARRAY_SIZE(BUTTON_DEFS)) - -static bool sw_val[BUTTON_NUM]; /* true for pressed */ -static uint64_t sw_freeze_time[BUTTON_NUM]; - -void button_init() -{ - for (int i = 0; i < BUTTON_NUM; i++) - { - sw_val[i] = false; - sw_freeze_time[i] = 0; - gpio_init(BUTTON_DEFS[i].sw_gpio); - gpio_set_function(BUTTON_DEFS[i].sw_gpio, GPIO_FUNC_SIO); - gpio_set_dir(BUTTON_DEFS[i].sw_gpio, GPIO_IN); - gpio_pull_up(BUTTON_DEFS[i].sw_gpio); - } - - for (int i = 0; i < BUTTON_NUM; i++) - { - gpio_init(BUTTON_DEFS[i].led_gpio); - gpio_set_dir(BUTTON_DEFS[i].led_gpio, GPIO_OUT); - } -} - -uint8_t button_num() -{ - return BUTTON_NUM; -} - -/* If a switch flips, it freezes for a while */ -#define DEBOUNCE_FREEZE_TIME_US 1000 -uint16_t button_read() -{ - uint64_t now = time_us_64(); - uint16_t buttons = 0; - - for (int i = BUTTON_NUM - 1; i >= 0; i--) { - bool sw_pressed = !gpio_get(BUTTON_DEFS[i].sw_gpio); - - if (now >= sw_freeze_time[i]) { - if (sw_pressed != sw_val[i]) { - sw_val[i] = sw_pressed; - sw_freeze_time[i] = now + DEBOUNCE_FREEZE_TIME_US; - rgb_stimulate(); - } - } - - buttons <<= 1; - if (sw_val[i]) { - buttons |= 1; - } - } - - return buttons; -} - -#define HID_EXPIRE_DURATION 1000000ULL -static uint32_t hid_expire_time = 0; -static bool hid_lights[BUTTON_NUM]; -static uint8_t hid_pwm[BUTTON_NUM]; - -void light_soft_pwm() -{ - static uint16_t pwm_cycle = 0; - pwm_cycle = (pwm_cycle + 1) % 900; - - for (int i = 0; i < BUTTON_NUM; i++) { - if (BUTTON_DEFS[i].led_gpio >= 0) { - gpio_put(BUTTON_DEFS[i].led_gpio, pwm_cycle <= hid_pwm[i] * hid_pwm[i]); - } - } -} - -void light_fade() -{ - static uint64_t update_time = 0; - uint64_t now = time_us_64(); - if (now - update_time > 6000) { - update_time = now; - for (int i = 0; i < BUTTON_NUM; i++) { - if (hid_pwm[i] > 0) { - hid_pwm[i]--; - } - } - } -} - -void button_update_light() -{ - bool hid_active = (time_us_64() < hid_expire_time); - for (int i = 0; i < BUTTON_NUM; i++) { - bool turn_on = hid_active ? hid_lights[i] : sw_val[i]; - if (turn_on) { - hid_pwm[i] = 35; - } - } - light_soft_pwm(); - light_fade(); -} - -void button_set_light(uint8_t const *lights, uint8_t num) -{ - for (int i = 0; (i < num) && (i < BUTTON_NUM); i++) { - hid_lights[i] = (lights[i] > 0); - } - hid_expire_time = time_us_64() + HID_EXPIRE_DURATION; -} diff --git a/FIRMWARE/src/buttons.h b/FIRMWARE/src/buttons.h deleted file mode 100644 index 6d5d116..0000000 --- a/FIRMWARE/src/buttons.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Pico Popn Controller Buttons - * WHowe - */ - -#ifndef BUTTONS_H -#define BUTTONS_H - -#include -#include - -void button_init(); -uint8_t button_num(); -uint16_t button_read(); - -void button_update_light(); -void button_set_light(uint8_t const *lights, uint8_t num); - -#endif diff --git a/FIRMWARE/src/main.c b/FIRMWARE/src/main.c deleted file mode 100644 index e255732..0000000 --- a/FIRMWARE/src/main.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Pico Popn Controller Main - * WHowe - */ - -#include -#include - -#include "bsp/board.h" -#include "tusb.h" -#include "usb_descriptors.h" - -#include "buttons.h" -#include "rgb.h" - -#define BUTTON_LIGHT_MAX_NUM 32 /* Must be larger than number of buttons */ -bool button_lights[BUTTON_LIGHT_MAX_NUM] = {0}; - -void update_lights() -{ - button_update_light(); -} - -struct report -{ - uint16_t buttons; - uint8_t joy0; - uint8_t joy1; -} report; - -void main_loop() -{ - if (tud_hid_ready()) - { - report.joy0 = 0; - report.joy1 = 0; - tud_hid_n_report(0x00, REPORT_ID_JOYSTICK, &report, sizeof(report)); - } -} - - -void init() -{ - board_init(); - tusb_init(); - button_init(); - rgb_init(); -} - -int main(void) -{ - init(); - - while (1) - { - tud_task(); - report.buttons = button_read(); - main_loop(); - update_lights(); - } - - return 0; -} - -// Invoked when received GET_REPORT control request -// Application must fill buffer report's content and return its length. -// Return zero will cause the stack to STALL request -uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, - hid_report_type_t report_type, uint8_t *buffer, - uint16_t reqlen) -{ - return 0; -} - -// Invoked when received SET_REPORT control request or -// received data on OUT endpoint ( Report ID = 0, Type = 0 ) -void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, - hid_report_type_t report_type, uint8_t const *buffer, - uint16_t bufsize) -{ - if ((report_id == REPORT_ID_LIGHTS) && - (report_type == HID_REPORT_TYPE_OUTPUT)) { - if (bufsize < button_num() + 3) { /* including logo rgb */ - return; - } - for (int i = 0; i < button_num(); i++) { - button_lights[i] = (buffer[i] > 0); - } - button_set_light(buffer, button_num()); - - uint8_t const *rgb = buffer + button_num(); - rgb_update_logo(rgb[0], rgb[1], rgb[2]); - } -} diff --git a/FIRMWARE/src/rgb.c b/FIRMWARE/src/rgb.c deleted file mode 100644 index 395f85c..0000000 --- a/FIRMWARE/src/rgb.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Pico Popn Controller Buttons - * WHowe - * - * A button consists of a switch and an LED - */ - -#include "buttons.h" - -#include -#include - -#include "pico/multicore.h" -#include "hardware/pio.h" -#include "hardware/timer.h" - -#include "ws2812.pio.h" - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -#define WS2812_PIN 28 - -uint8_t logo_leds[] = {0, 1, 2}; -uint8_t effect_leds[] = {3, 4, 5, 6, 7, 8, 9}; - -static inline void put_pixel(uint32_t pixel_grb) -{ - pio_sm_put_blocking(pio0, 0, pixel_grb << 8u); -} - -static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) -{ - /* better gamma curve */ - uint32_t r32 = (uint32_t)r * r; - uint32_t g32 = (uint32_t)g * g; - uint32_t b32 = (uint32_t)b * b; - return (g32 >> 8 << 16) | (r32 >> 8 << 8) | (b32 >> 8 << 0); -} - -/* 6 segment regular hsv color wheel, better color cycle - * https://www.arnevogel.com/rgb-rainbow/ - * https://www.instructables.com/How-to-Make-Proper-Rainbow-and-Random-Colors-With-/ - */ -uint32_t color_wheel(int index) -{ - uint32_t section = index / 256 % 6; - uint8_t incr = index % 256; - uint8_t decr = 255 - incr; - if (section == 0) { - return urgb_u32(incr, 0, 255); - } else if (section == 1) { - return urgb_u32(255, 0, decr); - } else if (section == 2) { - return urgb_u32(255, incr, 0); - } else if (section == 3) { - return urgb_u32(decr, 255, 0); - } else if (section == 4) { - return urgb_u32(0, 255, incr); - } else { - return urgb_u32(0, decr, 255); - } -} - -static uint32_t led_buf[sizeof(logo_leds) + sizeof(effect_leds)]; -void update_led() -{ - for (int i = 0; i < ARRAY_SIZE(led_buf); i++) { - put_pixel(led_buf[i]); - } -} - -#define HID_EXPIRE_DURATION 1000000ULL -static uint32_t hid_expire_time = 0; - -#define RAINBOW_SPEED_MAX 100 -#define RAINBOW_SPEED_MIN 4 -#define RAINBOW_PITCH 151 -#define RAINBOW_SPEED_DOWN_INTERVAL 200000ULL -uint32_t speed = RAINBOW_SPEED_MIN; -void rainbow_update() -{ - static uint32_t rotator = 0; - rotator += speed; - - for (int i = 0; i < sizeof(effect_leds); i++) { - led_buf[effect_leds[i]] = color_wheel(rotator + RAINBOW_PITCH * i); - } - - if (time_us_64() < hid_expire_time) { - return; - } - /* When there's no HID light input, use Logo LEDs for rainbow flow */ - uint32_t offset = rotator + RAINBOW_PITCH * sizeof(effect_leds); - for (int i = 0; i < sizeof(logo_leds); i++) { - led_buf[logo_leds[i]] = color_wheel(offset + RAINBOW_PITCH * i); - } -} - -void rainbow_speed_up() -{ - if (speed < RAINBOW_SPEED_MAX) { - speed++; - } -} - -void rainbow_speed_down() -{ - static uint64_t next_change_time = 0; - uint64_t now = time_us_64(); - if (now >= next_change_time) { - next_change_time = now + RAINBOW_SPEED_DOWN_INTERVAL; - if (speed > RAINBOW_SPEED_MIN) { - speed = speed * 95 / 100; - } - } -} - -void rgb_update_logo(uint8_t r, uint8_t g, uint8_t b) -{ - uint32_t color = urgb_u32(r, g, b); - for (int i = 0; i < sizeof(logo_leds); i++) { - led_buf[logo_leds[i]] = color; - } - hid_expire_time = time_us_64() + HID_EXPIRE_DURATION; -} - -void rgb_stimulate() -{ - rainbow_speed_up(); -} - -void rgb_entry() -{ - while (1) { - rainbow_update(); - rainbow_speed_down(); - update_led(); - sleep_ms(10); - } -} - -void rgb_init() -{ - uint offset = pio_add_program(pio0, &ws2812_program); - ws2812_program_init(pio0, 0, offset, WS2812_PIN, 800000, false); - multicore_launch_core1(rgb_entry); -} diff --git a/FIRMWARE/src/rgb.h b/FIRMWARE/src/rgb.h deleted file mode 100644 index fcbd278..0000000 --- a/FIRMWARE/src/rgb.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Pico Popn Controller Buttons - * WHowe - */ - -#ifndef RGB_H -#define RGB_H - -#include - -void rgb_init(); -void rgb_update_logo(uint8_t r, uint8_t g, uint8_t b); -void rgb_stimulate(); - -#endif diff --git a/FIRMWARE/src/tusb_config.h b/FIRMWARE/src/tusb_config.h deleted file mode 100644 index 2c1de22..0000000 --- a/FIRMWARE/src/tusb_config.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Ha Thach (tinyusb.org) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef _TUSB_CONFIG_H_ -#define _TUSB_CONFIG_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -//-------------------------------------------------------------------- -// COMMON CONFIGURATION -//-------------------------------------------------------------------- - -// defined by board.mk -#ifndef CFG_TUSB_MCU -#error CFG_TUSB_MCU must be defined -#endif - -// RHPort number used for device can be defined by board.mk, default to port 0 -#ifndef BOARD_DEVICE_RHPORT_NUM -#define BOARD_DEVICE_RHPORT_NUM 0 -#endif - -// RHPort max operational speed can defined by board.mk -// Default to Highspeed for MCU with internal HighSpeed PHY (can be port -// specific), otherwise FullSpeed -#ifndef BOARD_DEVICE_RHPORT_SPEED -#if (CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX || \ - CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || CFG_TUSB_MCU == OPT_MCU_NUC505 || \ - CFG_TUSB_MCU == OPT_MCU_CXD56) -#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_HIGH_SPEED -#else -#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_FULL_SPEED -#endif -#endif - -// Device mode with rhport and speed defined by board.mk -#if BOARD_DEVICE_RHPORT_NUM == 0 -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED) -#elif BOARD_DEVICE_RHPORT_NUM == 1 -#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED) -#else -#error "Incorrect RHPort configuration" -#endif - -#ifndef CFG_TUSB_OS -#define CFG_TUSB_OS OPT_OS_NONE -#endif - -// CFG_TUSB_DEBUG is defined by compiler in DEBUG build -// #define CFG_TUSB_DEBUG 0 - -/* USB DMA on some MCUs can only access a specific SRAM region with restriction - * on alignment. Tinyusb use follows macros to declare transferring memory so - * that they can be put into those specific section. e.g - * - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") )) - * - CFG_TUSB_MEM_ALIGN : __attribute__ ((aligned(4))) - */ -#ifndef CFG_TUSB_MEM_SECTION -#define CFG_TUSB_MEM_SECTION -#endif - -#ifndef CFG_TUSB_MEM_ALIGN -#define CFG_TUSB_MEM_ALIGN __attribute__((aligned(4))) -#endif - -//-------------------------------------------------------------------- -// DEVICE CONFIGURATION -//-------------------------------------------------------------------- - -#ifndef CFG_TUD_ENDPOINT0_SIZE -#define CFG_TUD_ENDPOINT0_SIZE 64 -#endif - -//------------- CLASS -------------// -#define CFG_TUD_HID 1 -#define CFG_TUD_CDC 0 -#define CFG_TUD_MSC 0 -#define CFG_TUD_MIDI 0 -#define CFG_TUD_VENDOR 0 - -// HID buffer size Should be sufficient to hold ID (if any) + Data -#define CFG_TUD_HID_EP_BUFSIZE 64 - -#ifdef __cplusplus -} -#endif - -#endif /* _TUSB_CONFIG_H_ */ diff --git a/FIRMWARE/src/usb_descriptors.c b/FIRMWARE/src/usb_descriptors.c deleted file mode 100644 index 7a9d8fb..0000000 --- a/FIRMWARE/src/usb_descriptors.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Ha Thach (tinyusb.org) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "usb_descriptors.h" - -#include "tusb.h" - -/* A combination of interfaces must have a unique product id, since PC will save - * device driver after the first plug. Same VID/PID with different interface e.g - * MSC (first), then CDC (later) will possibly cause system error on PC. - * - * Auto ProductID layout's Bitmap: - * [MSB] HID | MSC | CDC [LSB] - */ -#define _PID_MAP(itf, n) ((CFG_TUD_##itf) << (n)) -#define USB_PID \ - (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | \ - _PID_MAP(MIDI, 3) | _PID_MAP(VENDOR, 4)) - -//--------------------------------------------------------------------+ -// Device Descriptors -//--------------------------------------------------------------------+ -tusb_desc_device_t const desc_device_joy = { - .bLength = sizeof(tusb_desc_device_t), - .bDescriptorType = TUSB_DESC_DEVICE, - .bcdUSB = 0x0200, - .bDeviceClass = 0x00, - .bDeviceSubClass = 0x00, - .bDeviceProtocol = 0x00, - .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - - .idVendor = 0xCafe, - .idProduct = USB_PID, - .bcdDevice = 0x0100, - - .iManufacturer = 0x01, - .iProduct = 0x02, - .iSerialNumber = 0x03, - - .bNumConfigurations = 0x01}; - -// Invoked when received GET DEVICE DESCRIPTOR -// Application return pointer to descriptor -uint8_t const* tud_descriptor_device_cb(void) { - return (uint8_t const*)&desc_device_joy; -} - -//--------------------------------------------------------------------+ -// HID Report Descriptor -//--------------------------------------------------------------------+ - -uint8_t const desc_hid_report_joy[] = { - GAMECON_REPORT_DESC_JOYSTICK(HID_REPORT_ID(REPORT_ID_JOYSTICK)), - GAMECON_REPORT_DESC_LIGHTS(HID_REPORT_ID(REPORT_ID_LIGHTS)) -}; - -// Invoked when received GET HID REPORT DESCRIPTOR -// Application return pointer to descriptor -// Descriptor contents must exist long enough for transfer to complete -uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf) { - (void)itf; - return desc_hid_report_joy; -} - -//--------------------------------------------------------------------+ -// Configuration Descriptor -//--------------------------------------------------------------------+ - -enum { ITF_NUM_HID, ITF_NUM_TOTAL }; - -#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN) - -#define EPNUM_HID 0x81 - -uint8_t const desc_configuration_joy[] = { - // Config number, interface count, string index, total length, attribute, - // power in mA - TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, - TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), - - // Interface number, string index, protocol, report descriptor len, EP In - // address, size & polling interval - TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, - sizeof(desc_hid_report_joy), EPNUM_HID, - CFG_TUD_HID_EP_BUFSIZE, 1)}; - -// Invoked when received GET CONFIGURATION DESCRIPTOR -// Application return pointer to descriptor -// Descriptor contents must exist long enough for transfer to complete -uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { - (void)index; // for multiple configurations - return desc_configuration_joy; -} - -//--------------------------------------------------------------------+ -// String Descriptors -//--------------------------------------------------------------------+ - -// array of pointer to string descriptors -char const* string_desc_arr[] = { - (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) - "WHowe" , // 1: Manufacturer - "Pico Popn Controller", // 2: Product - "123456", // 3: Serials, should use chip ID - "Button 1", - "Button 2", - "Button 3", - "Button 4", - "Button 5", - "Button 6", - "Button 7", - "Button 8", - "Button 9", - "Button 10", - "Button 11", - "Logo Red", - "Logo Green", - "Logo Blue", -}; - -static uint16_t _desc_str[64]; - -// Invoked when received GET STRING DESCRIPTOR request -// Application return pointer to descriptor, whose contents must exist long -// enough for transfer to complete -uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { - (void)langid; - - uint8_t chr_count; - - if (index == 0) { - memcpy(&_desc_str[1], string_desc_arr[0], 2); - chr_count = 1; - } else { - // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors. - // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors - - if (index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) { - const char* str = string_desc_arr[index]; - - // Cap at max char - chr_count = strlen(str); - if (chr_count > 63) chr_count = 63; - - // Convert ASCII string into UTF-16 - for (uint8_t i = 0; i < chr_count; i++) { - _desc_str[1 + i] = str[i]; - } - } else { - _desc_str[1] = 'X'; - chr_count = 1; - } - } - - - // first byte is length (including header), second byte is string type - _desc_str[0] = (TUSB_DESC_STRING << 8) | (2 * chr_count + 2); - - return _desc_str; -} diff --git a/FIRMWARE/src/usb_descriptors.h b/FIRMWARE/src/usb_descriptors.h deleted file mode 100644 index 5c47e6a..0000000 --- a/FIRMWARE/src/usb_descriptors.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef USB_DESCRIPTORS_H_ -#define USB_DESCRIPTORS_H_ - -#include "common/tusb_common.h" -#include "device/usbd.h" - -enum { - REPORT_ID_JOYSTICK = 1, - REPORT_ID_LIGHTS, - REPORT_ID_KEYBOARD, - REPORT_ID_MOUSE, -}; - -// because they are missing from tusb_hid.h -#define HID_STRING_INDEX(x) HID_REPORT_ITEM(x, 7, RI_TYPE_LOCAL, 1) -#define HID_STRING_INDEX_N(x, n) HID_REPORT_ITEM(x, 7, RI_TYPE_LOCAL, n) -#define HID_STRING_MINIMUM(x) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, 1) -#define HID_STRING_MINIMUM_N(x, n) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, n) -#define HID_STRING_MAXIMUM(x) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, 1) -#define HID_STRING_MAXIMUM_N(x, n) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, n) - -// Joystick Report Descriptor Template - Based off Drewol/rp2040-gamecon -// Button Map | X | Y -#define GAMECON_REPORT_DESC_JOYSTICK(...) \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ - HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \ - HID_COLLECTION(HID_COLLECTION_APPLICATION), \ - __VA_ARGS__ HID_USAGE_PAGE(HID_USAGE_PAGE_BUTTON), HID_USAGE_MIN(1), \ - HID_USAGE_MAX(11), \ - HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), HID_REPORT_COUNT(11), \ - HID_REPORT_SIZE(1), HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - HID_REPORT_COUNT(1), HID_REPORT_SIZE(16 - 11), /*Padding*/\ - HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_LOGICAL_MIN(0x00), \ - HID_LOGICAL_MAX_N(0x00ff, 2), \ - HID_USAGE(HID_USAGE_DESKTOP_X), /*Joystick*/ \ - HID_USAGE(HID_USAGE_DESKTOP_Y), HID_REPORT_COUNT(2), HID_REPORT_SIZE(8), \ - HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), HID_COLLECTION_END - -// Light Map -#define GAMECON_REPORT_DESC_LIGHTS(...) \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_USAGE(0x00), \ - HID_COLLECTION(HID_COLLECTION_APPLICATION), \ - __VA_ARGS__ HID_REPORT_COUNT(11 + 3), /*LED NUM + RGB */ \ - HID_REPORT_SIZE(8), HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), HID_STRING_MINIMUM(4), \ - HID_STRING_MAXIMUM(16), HID_USAGE_MIN(1), HID_USAGE_MAX(16), \ - HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), HID_REPORT_COUNT(1), \ - HID_REPORT_SIZE(8), /*Padding*/ \ - HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \ - HID_COLLECTION_END - -// NKRO Descriptor -#define GAMECON_REPORT_DESC_NKRO(...) \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_USAGE(HID_USAGE_PAGE_KEYBOARD), \ - HID_COLLECTION(HID_COLLECTION_APPLICATION), \ - __VA_ARGS__ HID_REPORT_SIZE(1), HID_REPORT_COUNT(8), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), HID_USAGE_MIN(224), \ - HID_USAGE_MAX(231), HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), \ - HID_INPUT(HID_VARIABLE), HID_REPORT_SIZE(1), HID_REPORT_COUNT(31 * 8), \ - HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), HID_USAGE_MIN(0), \ - HID_USAGE_MAX(31 * 8 - 1), HID_INPUT(HID_VARIABLE), HID_COLLECTION_END - -#endif /* USB_DESCRIPTORS_H_ */ \ No newline at end of file diff --git a/FIRMWARE/src/ws2812.pio b/FIRMWARE/src/ws2812.pio deleted file mode 100644 index 3c31fd6..0000000 --- a/FIRMWARE/src/ws2812.pio +++ /dev/null @@ -1,85 +0,0 @@ -; -; Copyright (c) 2020 Raspberry Pi (Trading) Ltd. -; -; SPDX-License-Identifier: BSD-3-Clause -; - -.program ws2812 -.side_set 1 - -.define public T1 2 -.define public T2 5 -.define public T3 3 - -.lang_opt python sideset_init = pico.PIO.OUT_HIGH -.lang_opt python out_init = pico.PIO.OUT_HIGH -.lang_opt python out_shiftdir = 1 - -.wrap_target -bitloop: - out x, 1 side 0 [T3 - 1] ; Side-set still takes place when instruction stalls - jmp !x do_zero side 1 [T1 - 1] ; Branch on the bit we shifted out. Positive pulse -do_one: - jmp bitloop side 1 [T2 - 1] ; Continue driving high, for a long pulse -do_zero: - nop side 0 [T2 - 1] ; Or drive low, for a short pulse -.wrap - -% c-sdk { -#include "hardware/clocks.h" - -static inline void ws2812_program_init(PIO pio, uint sm, uint offset, uint pin, float freq, bool rgbw) { - - pio_gpio_init(pio, pin); - pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); - - pio_sm_config c = ws2812_program_get_default_config(offset); - sm_config_set_sideset_pins(&c, pin); - sm_config_set_out_shift(&c, false, true, rgbw ? 32 : 24); - sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); - - int cycles_per_bit = ws2812_T1 + ws2812_T2 + ws2812_T3; - float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit); - sm_config_set_clkdiv(&c, div); - - pio_sm_init(pio, sm, offset, &c); - pio_sm_set_enabled(pio, sm, true); -} -%} - -.program ws2812_parallel - -.define public T1 2 -.define public T2 5 -.define public T3 3 - -.wrap_target - out x, 32 - mov pins, !null [T1-1] - mov pins, x [T2-1] - mov pins, null [T3-2] -.wrap - -% c-sdk { -#include "hardware/clocks.h" - -static inline void ws2812_parallel_program_init(PIO pio, uint sm, uint offset, uint pin_base, uint pin_count, float freq) { - for(uint i=pin_base; i