Repository: adafruit/Adafruit_Blinka (language: python)

Issue:
Add pre-commit support
Add a `.pre-commit-config-yaml`. I did this as a test, and there are many minor things to fix, such as licensing and avoiding certain pyling problems in the tests.


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0da2cc6c..c955ed07 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
 name: Build CI
 
 on: [pull_request, push]
@@ -33,18 +36,14 @@ jobs:
       # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.)
       run: |
         source actions-ci/install.sh
-    - name: Pip install pylint, black, & Sphinx
+    - name: Pip install Sphinx, pre-commit
       run: |
-        pip install --force-reinstall pylint==2.7.1 black Sphinx sphinx-rtd-theme
+        pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit
     - name: Library version
       run: git describe --dirty --always --tags
-    - name: Check formatting
+    - name: Pre-commit hooks
       run: |
-        black --check --target-version=py37 .
-    - name: PyLint
-      run: |
-        pylint $( find src -name '*.py' )
-        ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace $( find . -path "./examples/*.py" ))
+        pre-commit run --all-files
     - name: Build docs
       working-directory: docs
       run: sphinx-build -E -W -b html . _build/html
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ce2635bc..9aa3d4cc 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
 name: Release Actions
 
 on:
diff --git a/.gitignore b/.gitignore
index e7e0f2da..5fb597bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
 *.mpy
 .idea
 __pycache__
diff --git a/.gitmodules b/.gitmodules
index 41bbf17c..b23b276e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
 [submodule "test/libraries/bme280"]
 	path = test/libraries/bme280
 	url = https://github.com/adafruit/Adafruit_CircuitPython_BME280.git
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000..bf33d629
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,42 @@
+# SPDX-FileCopyrightText: 2022 Adafruit
+#
+# SPDX-License-Identifier: Unlicense
+
+repos:
+-   repo: https://github.com/python/black
+    rev: 20.8b1
+    hooks:
+    - id: black
+-   repo: https://github.com/fsfe/reuse-tool
+    rev: v0.12.1
+    hooks:
+    - id: reuse
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v2.3.0
+    hooks:
+    -   id: check-yaml
+    -   id: end-of-file-fixer
+    -   id: trailing-whitespace
+-   repo: https://github.com/pycqa/pylint
+    rev: v2.11.1
+    hooks:
+    -   id: pylint
+        name: pylint (library code)
+        types: [python]
+        files: "^src/"
+        args:
+          - --disable=consider-using-f-string,duplicate-code
+    -   id: pylint
+        name: pylint (example code)
+        description: Run pylint rules on "examples/*.py" files
+        types: [python]
+        files: "^examples/"
+        args:
+        - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
+    -   id: pylint
+        name: pylint (test code)
+        description: Run pylint rules on "tests/*.py" files
+        types: [python]
+        files: "^tests/"
+        args:
+        - --disable=missing-docstring,consider-using-f-string,duplicate-code
diff --git a/.pylintrc b/.pylintrc
index 35b40b5f..0267cf0a 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
 [MASTER]
 
 # A comma-separated list of package or module names from where C extensions may
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 00000000..b7f92082
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,15 @@
+
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+python:
+  version: "3.7"
+  install:
+    - requirements: docs/requirements.txt
+    - requirements: requirements.txt
diff --git a/.readthedocs.yml b/.readthedocs.yml
deleted file mode 100644
index f4243ad5..00000000
--- a/.readthedocs.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-python:
-    version: 3
-requirements_file: requirements.txt
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 1617586f..a5f7ed20 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,3 +1,9 @@
+<!--
+SPDX-FileCopyrightText: 2014 Coraline Ada Ehmke
+SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
 # Contributor Covenant Code of Conduct
 
 ## Our Pledge
diff --git a/LICENSE b/LICENSE
index b3c1ecf8..794a9d86 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2017 cefn for adafruit industries
+Copyright (c) 2018 Adafruit Industries
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt
new file mode 100644
index 00000000..3f92dfc5
--- /dev/null
+++ b/LICENSES/CC-BY-4.0.txt
@@ -0,0 +1,324 @@
+Creative Commons Attribution 4.0 International Creative Commons Corporation
+("Creative Commons") is not a law firm and does not provide legal services
+or legal advice. Distribution of Creative Commons public licenses does not
+create a lawyer-client or other relationship. Creative Commons makes its licenses
+and related information available on an "as-is" basis. Creative Commons gives
+no warranties regarding its licenses, any material licensed under their terms
+and conditions, or any related information. Creative Commons disclaims all
+liability for damages resulting from their use to the fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and conditions
+that creators and other rights holders may use to share original works of
+authorship and other material subject to copyright and certain other rights
+specified in the public license below. The following considerations are for
+informational purposes only, are not exhaustive, and do not form part of our
+licenses.
+
+Considerations for licensors: Our public licenses are intended for use by
+those authorized to give the public permission to use material in ways otherwise
+restricted by copyright and certain other rights. Our licenses are irrevocable.
+Licensors should read and understand the terms and conditions of the license
+they choose before applying it. Licensors should also secure all rights necessary
+before applying our licenses so that the public can reuse the material as
+expected. Licensors should clearly mark any material not subject to the license.
+This includes other CC-licensed material, or material used under an exception
+or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors
+
+Considerations for the public: By using one of our public licenses, a licensor
+grants the public permission to use the licensed material under specified
+terms and conditions. If the licensor's permission is not necessary for any
+reason–for example, because of any applicable exception or limitation to copyright–then
+that use is not regulated by the license. Our licenses grant only permissions
+under copyright and certain other rights that a licensor has authority to
+grant. Use of the licensed material may still be restricted for other reasons,
+including because others have copyright or other rights in the material. A
+licensor may make special requests, such as asking that all changes be marked
+or described. Although not required by our licenses, you are encouraged to
+respect those requests where reasonable. More considerations for the public
+: wiki.creativecommons.org/Considerations_for_licensees Creative Commons Attribution
+4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree to
+be bound by the terms and conditions of this Creative Commons Attribution
+4.0 International Public License ("Public License"). To the extent this Public
+License may be interpreted as a contract, You are granted the Licensed Rights
+in consideration of Your acceptance of these terms and conditions, and the
+Licensor grants You such rights in consideration of benefits the Licensor
+receives from making the Licensed Material available under these terms and
+conditions.
+
+Section 1 – Definitions.
+
+a. Adapted Material means material subject to Copyright and Similar Rights
+that is derived from or based upon the Licensed Material and in which the
+Licensed Material is translated, altered, arranged, transformed, or otherwise
+modified in a manner requiring permission under the Copyright and Similar
+Rights held by the Licensor. For purposes of this Public License, where the
+Licensed Material is a musical work, performance, or sound recording, Adapted
+Material is always produced where the Licensed Material is synched in timed
+relation with a moving image.
+
+b. Adapter's License means the license You apply to Your Copyright and Similar
+Rights in Your contributions to Adapted Material in accordance with the terms
+and conditions of this Public License.
+
+c. Copyright and Similar Rights means copyright and/or similar rights closely
+related to copyright including, without limitation, performance, broadcast,
+sound recording, and Sui Generis Database Rights, without regard to how the
+rights are labeled or categorized. For purposes of this Public License, the
+rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
+
+d. Effective Technological Measures means those measures that, in the absence
+of proper authority, may not be circumvented under laws fulfilling obligations
+under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996,
+and/or similar international agreements.
+
+e. Exceptions and Limitations means fair use, fair dealing, and/or any other
+exception or limitation to Copyright and Similar Rights that applies to Your
+use of the Licensed Material.
+
+f. Licensed Material means the artistic or literary work, database, or other
+material to which the Licensor applied this Public License.
+
+g. Licensed Rights means the rights granted to You subject to the terms and
+conditions of this Public License, which are limited to all Copyright and
+Similar Rights that apply to Your use of the Licensed Material and that the
+Licensor has authority to license.
+
+h. Licensor means the individual(s) or entity(ies) granting rights under this
+Public License.
+
+i. Share means to provide material to the public by any means or process that
+requires permission under the Licensed Rights, such as reproduction, public
+display, public performance, distribution, dissemination, communication, or
+importation, and to make material available to the public including in ways
+that members of the public may access the material from a place and at a time
+individually chosen by them.
+
+j. Sui Generis Database Rights means rights other than copyright resulting
+from Directive 96/9/EC of the European Parliament and of the Council of 11
+March 1996 on the legal protection of databases, as amended and/or succeeded,
+as well as other essentially equivalent rights anywhere in the world.
+
+k. You means the individual or entity exercising the Licensed Rights under
+this Public License. Your has a corresponding meaning.
+
+Section 2 – Scope.
+
+   a. License grant.
+
+1. Subject to the terms and conditions of this Public License, the Licensor
+hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive,
+irrevocable license to exercise the Licensed Rights in the Licensed Material
+to:
+
+         A. reproduce and Share the Licensed Material, in whole or in part; and
+
+         B. produce, reproduce, and Share Adapted Material.
+
+2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions
+and Limitations apply to Your use, this Public License does not apply, and
+You do not need to comply with its terms and conditions.
+
+      3. Term. The term of this Public License is specified in Section 6(a).
+
+4. Media and formats; technical modifications allowed. The Licensor authorizes
+You to exercise the Licensed Rights in all media and formats whether now known
+or hereafter created, and to make technical modifications necessary to do
+so. The Licensor waives and/or agrees not to assert any right or authority
+to forbid You from making technical modifications necessary to exercise the
+Licensed Rights, including technical modifications necessary to circumvent
+Effective Technological Measures. For purposes of this Public License, simply
+making modifications authorized by this Section 2(a)(4) never produces Adapted
+Material.
+
+      5. Downstream recipients.
+
+A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed
+Material automatically receives an offer from the Licensor to exercise the
+Licensed Rights under the terms and conditions of this Public License.
+
+B. No downstream restrictions. You may not offer or impose any additional
+or different terms or conditions on, or apply any Effective Technological
+Measures to, the Licensed Material if doing so restricts exercise of the Licensed
+Rights by any recipient of the Licensed Material.
+
+6. No endorsement. Nothing in this Public License constitutes or may be construed
+as permission to assert or imply that You are, or that Your use of the Licensed
+Material is, connected with, or sponsored, endorsed, or granted official status
+by, the Licensor or others designated to receive attribution as provided in
+Section 3(a)(1)(A)(i).
+
+   b. Other rights.
+
+1. Moral rights, such as the right of integrity, are not licensed under this
+Public License, nor are publicity, privacy, and/or other similar personality
+rights; however, to the extent possible, the Licensor waives and/or agrees
+not to assert any such rights held by the Licensor to the limited extent necessary
+to allow You to exercise the Licensed Rights, but not otherwise.
+
+2. Patent and trademark rights are not licensed under this Public License.
+
+3. To the extent possible, the Licensor waives any right to collect royalties
+from You for the exercise of the Licensed Rights, whether directly or through
+a collecting society under any voluntary or waivable statutory or compulsory
+licensing scheme. In all other cases the Licensor expressly reserves any right
+to collect such royalties.
+
+Section 3 – License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the following
+conditions.
+
+   a. Attribution.
+
+1. If You Share the Licensed Material (including in modified form), You must:
+
+A. retain the following if it is supplied by the Licensor with the Licensed
+Material:
+
+i. identification of the creator(s) of the Licensed Material and any others
+designated to receive attribution, in any reasonable manner requested by the
+Licensor (including by pseudonym if designated);
+
+            ii. a copyright notice;
+
+            iii. a notice that refers to this Public License;
+
+            iv. a notice that refers to the disclaimer of warranties;
+
+v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
+
+B. indicate if You modified the Licensed Material and retain an indication
+of any previous modifications; and
+
+C. indicate the Licensed Material is licensed under this Public License, and
+include the text of, or the URI or hyperlink to, this Public License.
+
+2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner
+based on the medium, means, and context in which You Share the Licensed Material.
+For example, it may be reasonable to satisfy the conditions by providing a
+URI or hyperlink to a resource that includes the required information.
+
+3. If requested by the Licensor, You must remove any of the information required
+by Section 3(a)(1)(A) to the extent reasonably practicable.
+
+4. If You Share Adapted Material You produce, the Adapter's License You apply
+must not prevent recipients of the Adapted Material from complying with this
+Public License.
+
+Section 4 – Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that apply to
+Your use of the Licensed Material:
+
+a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract,
+reuse, reproduce, and Share all or a substantial portion of the contents of
+the database;
+
+b. if You include all or a substantial portion of the database contents in
+a database in which You have Sui Generis Database Rights, then the database
+in which You have Sui Generis Database Rights (but not its individual contents)
+is Adapted Material; and
+
+c. You must comply with the conditions in Section 3(a) if You Share all or
+a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not replace
+Your obligations under this Public License where the Licensed Rights include
+other Copyright and Similar Rights.
+
+Section 5 – Disclaimer of Warranties and Limitation of Liability.
+
+a. Unless otherwise separately undertaken by the Licensor, to the extent possible,
+the Licensor offers the Licensed Material as-is and as-available, and makes
+no representations or warranties of any kind concerning the Licensed Material,
+whether express, implied, statutory, or other. This includes, without limitation,
+warranties of title, merchantability, fitness for a particular purpose, non-infringement,
+absence of latent or other defects, accuracy, or the presence or absence of
+errors, whether or not known or discoverable. Where disclaimers of warranties
+are not allowed in full or in part, this disclaimer may not apply to You.
+
+b. To the extent possible, in no event will the Licensor be liable to You
+on any legal theory (including, without limitation, negligence) or otherwise
+for any direct, special, indirect, incidental, consequential, punitive, exemplary,
+or other losses, costs, expenses, or damages arising out of this Public License
+or use of the Licensed Material, even if the Licensor has been advised of
+the possibility of such losses, costs, expenses, or damages. Where a limitation
+of liability is not allowed in full or in part, this limitation may not apply
+to You.
+
+c. The disclaimer of warranties and limitation of liability provided above
+shall be interpreted in a manner that, to the extent possible, most closely
+approximates an absolute disclaimer and waiver of all liability.
+
+Section 6 – Term and Termination.
+
+a. This Public License applies for the term of the Copyright and Similar Rights
+licensed here. However, if You fail to comply with this Public License, then
+Your rights under this Public License terminate automatically.
+
+b. Where Your right to use the Licensed Material has terminated under Section
+6(a), it reinstates:
+
+1. automatically as of the date the violation is cured, provided it is cured
+within 30 days of Your discovery of the violation; or
+
+      2. upon express reinstatement by the Licensor.
+
+c. For the avoidance of doubt, this Section 6(b) does not affect any right
+the Licensor may have to seek remedies for Your violations of this Public
+License.
+
+d. For the avoidance of doubt, the Licensor may also offer the Licensed Material
+under separate terms or conditions or stop distributing the Licensed Material
+at any time; however, doing so will not terminate this Public License.
+
+   e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
+
+Section 7 – Other Terms and Conditions.
+
+a. The Licensor shall not be bound by any additional or different terms or
+conditions communicated by You unless expressly agreed.
+
+b. Any arrangements, understandings, or agreements regarding the Licensed
+Material not stated herein are separate from and independent of the terms
+and conditions of this Public License.
+
+Section 8 – Interpretation.
+
+a. For the avoidance of doubt, this Public License does not, and shall not
+be interpreted to, reduce, limit, restrict, or impose conditions on any use
+of the Licensed Material that could lawfully be made without permission under
+this Public License.
+
+b. To the extent possible, if any provision of this Public License is deemed
+unenforceable, it shall be automatically reformed to the minimum extent necessary
+to make it enforceable. If the provision cannot be reformed, it shall be severed
+from this Public License without affecting the enforceability of the remaining
+terms and conditions.
+
+c. No term or condition of this Public License will be waived and no failure
+to comply consented to unless expressly agreed to by the Licensor.
+
+d. Nothing in this Public License constitutes or may be interpreted as a limitation
+upon, or waiver of, any privileges and immunities that apply to the Licensor
+or You, including from the legal processes of any jurisdiction or authority.
+
+Creative Commons is not a party to its public licenses. Notwithstanding, Creative
+Commons may elect to apply one of its public licenses to material it publishes
+and in those instances will be considered the "Licensor." The text of the
+Creative Commons public licenses is dedicated to the public domain under the
+CC0 Public Domain Dedication. Except for the limited purpose of indicating
+that material is shared under a Creative Commons public license or as otherwise
+permitted by the Creative Commons policies published at creativecommons.org/policies,
+Creative Commons does not authorize the use of the trademark "Creative Commons"
+or any other trademark or logo of Creative Commons without its prior written
+consent including, without limitation, in connection with any unauthorized
+modifications to any of its public licenses or any other arrangements, understandings,
+or agreements concerning use of licensed material. For the avoidance of doubt,
+this paragraph does not form part of the public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt
new file mode 100644
index 00000000..204b93da
--- /dev/null
+++ b/LICENSES/MIT.txt
@@ -0,0 +1,19 @@
+MIT License Copyright (c) <year> <copyright holders>
+
+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 (including the next
+paragraph) 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.
diff --git a/LICENSES/Unlicense.txt b/LICENSES/Unlicense.txt
new file mode 100644
index 00000000..24a8f901
--- /dev/null
+++ b/LICENSES/Unlicense.txt
@@ -0,0 +1,20 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute
+this software, either in source code form or as a compiled binary, for any
+purpose, commercial or non-commercial, and by any means.
+
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and
+to the detriment of our heirs and successors. We intend this dedication to
+be an overt act of relinquishment in perpetuity of all present and future
+rights to this software under copyright law.
+
+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
+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. For more information,
+please refer to <https://unlicense.org/>
diff --git a/README.rst.license b/README.rst.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/README.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/docs/_static/favicon.ico.license b/docs/_static/favicon.ico.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/docs/_static/favicon.ico.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/docs/api.rst.license b/docs/api.rst.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/docs/api.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/docs/conf.py b/docs/conf.py
index 2e54ac77..84be2653 100755
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,5 +1,9 @@
 # -*- coding: utf-8 -*-
 
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
 import os
 import sys
 
diff --git a/docs/examples.rst.license b/docs/examples.rst.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/docs/examples.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/docs/index.rst.license b/docs/index.rst.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/docs/index.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 00000000..88e67331
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,5 @@
+# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+sphinx>=4.0.0
diff --git a/examples/analog_in.py b/examples/analog_in.py
index d72fbdca..af936d1a 100644
--- a/examples/analog_in.py
+++ b/examples/analog_in.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Analog in demo"""
 import time
 import board
diff --git a/examples/bbb_digitalio.py b/examples/bbb_digitalio.py
index 9d8af717..8cb7c64c 100755
--- a/examples/bbb_digitalio.py
+++ b/examples/bbb_digitalio.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
 # Example of blinking LED on BeagleBone Black
 # https://www.adafruit.com/product/1876
 #
diff --git a/examples/mcps_busio_i2c.py b/examples/mcps_busio_i2c.py
index 4729e3ea..e4da0f16 100644
--- a/examples/mcps_busio_i2c.py
+++ b/examples/mcps_busio_i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import time
 import hid
 import busio
diff --git a/examples/pb_digitalio.py b/examples/pb_digitalio.py
index 0eb3a2b1..89ae3477 100755
--- a/examples/pb_digitalio.py
+++ b/examples/pb_digitalio.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
 # Example of blinking LED on PocketBeagle
 # https://www.adafruit.com/product/4179
 #
diff --git a/examples/pi_busio_i2c.py b/examples/pi_busio_i2c.py
index f3b4eeab..e2b3ce26 100644
--- a/examples/pi_busio_i2c.py
+++ b/examples/pi_busio_i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import time
 import sys
 import board
diff --git a/examples/pi_busio_spi.py b/examples/pi_busio_spi.py
index 1f845b27..f8899e10 100644
--- a/examples/pi_busio_spi.py
+++ b/examples/pi_busio_spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import time
 import board
 import busio
diff --git a/examples/pi_digitalio.py b/examples/pi_digitalio.py
index 7c6a622e..96f964c1 100644
--- a/examples/pi_digitalio.py
+++ b/examples/pi_digitalio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import time
 import board
 import digitalio
diff --git a/examples/piblinka.py b/examples/piblinka.py
index 471715eb..6728b6d7 100644
--- a/examples/piblinka.py
+++ b/examples/piblinka.py
@@ -1,6 +1,9 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import sys
 import time
-import adafruit_blinka.agnostic as agnostic
+from adafruit_blinka import agnostic
 import board
 import digitalio
 
diff --git a/requirements.txt.license b/requirements.txt.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/requirements.txt.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/setup.py b/setup.py
index a819f320..fc2a39b6 100755
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
 # Note: To use the 'upload' functionality of this file, you must:
 #   $ pip install twine
 
diff --git a/src/__version__.py b/src/__version__.py
index 4a384b3b..49f0aeba 100644
--- a/src/__version__.py
+++ b/src/__version__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Return the current version"""
 VERSION = (1, 0, 0)
 
diff --git a/src/adafruit_blinka/__init__.py b/src/adafruit_blinka/__init__.py
index 69e91785..5bdb2a5c 100755
--- a/src/adafruit_blinka/__init__.py
+++ b/src/adafruit_blinka/__init__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `adafruit_blinka` - Runtime utility objects for re-implementation of CircuitPython API
 ======================================================================================
diff --git a/src/adafruit_blinka/agnostic/__init__.py b/src/adafruit_blinka/agnostic/__init__.py
index 1f6eb4c3..14121d37 100755
--- a/src/adafruit_blinka/agnostic/__init__.py
+++ b/src/adafruit_blinka/agnostic/__init__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allows useful indirection to test Pin naming logic by switching platform in testing
     or provide bootstrapping logic for board identification where auto-detection is not
     feasible (e.g. multiple ESP8266 boards architecturally identical). Once runtime
diff --git a/src/adafruit_blinka/agnostic/time.py b/src/adafruit_blinka/agnostic/time.py
index 46cb837d..c0eca3c4 100755
--- a/src/adafruit_blinka/agnostic/time.py
+++ b/src/adafruit_blinka/agnostic/time.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Platform agnostic time implementation"""
 
 from adafruit_blinka import agnostic
diff --git a/src/adafruit_blinka/board/bananapi/__init__.py b/src/adafruit_blinka/board/bananapi/__init__.py
index 8d40623f..6bc6884b 100644
--- a/src/adafruit_blinka/board/bananapi/__init__.py
+++ b/src/adafruit_blinka/board/bananapi/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from Banana Pi"""
diff --git a/src/adafruit_blinka/board/bananapi/bpim2zero.py b/src/adafruit_blinka/board/bananapi/bpim2zero.py
index 10da54be..bd720e22 100644
--- a/src/adafruit_blinka/board/bananapi/bpim2zero.py
+++ b/src/adafruit_blinka/board/bananapi/bpim2zero.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Banana Pi M2 Zero."""
 
 # The Banana Pi M2 Zero uses the AllWinner H2 SoC, but pins
diff --git a/src/adafruit_blinka/board/beagleboard/__init__.py b/src/adafruit_blinka/board/beagleboard/__init__.py
index 139ec8d7..b55eef28 100644
--- a/src/adafruit_blinka/board/beagleboard/__init__.py
+++ b/src/adafruit_blinka/board/beagleboard/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from BeagleBoard"""
diff --git a/src/adafruit_blinka/board/beagleboard/beaglebone_ai.py b/src/adafruit_blinka/board/beagleboard/beaglebone_ai.py
index d88111fc..5c5d78d7 100644
--- a/src/adafruit_blinka/board/beagleboard/beaglebone_ai.py
+++ b/src/adafruit_blinka/board/beagleboard/beaglebone_ai.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Beaglebone Black."""
 from adafruit_blinka.microcontroller.dra74x import pin
 
diff --git a/src/adafruit_blinka/board/beagleboard/beaglebone_black.py b/src/adafruit_blinka/board/beagleboard/beaglebone_black.py
index b3a301c7..de58a1b9 100644
--- a/src/adafruit_blinka/board/beagleboard/beaglebone_black.py
+++ b/src/adafruit_blinka/board/beagleboard/beaglebone_black.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Beaglebone Black."""
 from adafruit_blinka.microcontroller.am335x import pin
 
diff --git a/src/adafruit_blinka/board/beagleboard/beaglebone_pocketbeagle.py b/src/adafruit_blinka/board/beagleboard/beaglebone_pocketbeagle.py
index 43c20f9c..a24fd6bc 100644
--- a/src/adafruit_blinka/board/beagleboard/beaglebone_pocketbeagle.py
+++ b/src/adafruit_blinka/board/beagleboard/beaglebone_pocketbeagle.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Pin definitions for the Beaglebone PocketBeagle.
 
diff --git a/src/adafruit_blinka/board/beagleboard/beaglev_starlight.py b/src/adafruit_blinka/board/beagleboard/beaglev_starlight.py
index 0240464e..95bb9220 100644
--- a/src/adafruit_blinka/board/beagleboard/beaglev_starlight.py
+++ b/src/adafruit_blinka/board/beagleboard/beaglev_starlight.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the BeagleV StarLight."""
 
 from adafruit_blinka.microcontroller.starfive.JH71x0 import pin
diff --git a/src/adafruit_blinka/board/binho_nova.py b/src/adafruit_blinka/board/binho_nova.py
index 1e01f61f..cffb6161 100644
--- a/src/adafruit_blinka/board/binho_nova.py
+++ b/src/adafruit_blinka/board/binho_nova.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Binho Nova"""
 from adafruit_blinka.microcontroller.nova import pin
 
diff --git a/src/adafruit_blinka/board/clockworkcpi3.py b/src/adafruit_blinka/board/clockworkcpi3.py
index 2e8a00b4..a93ffeb8 100644
--- a/src/adafruit_blinka/board/clockworkcpi3.py
+++ b/src/adafruit_blinka/board/clockworkcpi3.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Clockwork Pi (CPI3) board."""
 
 from adafruit_blinka.microcontroller.allwinner.a33 import pin
diff --git a/src/adafruit_blinka/board/coral_dev_board.py b/src/adafruit_blinka/board/coral_dev_board.py
index fd860d2c..04fcbde9 100644
--- a/src/adafruit_blinka/board/coral_dev_board.py
+++ b/src/adafruit_blinka/board/coral_dev_board.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Coral Dev Board."""
 
 from adafruit_blinka.microcontroller.nxp_imx8m import pin
diff --git a/src/adafruit_blinka/board/coral_dev_board_mini.py b/src/adafruit_blinka/board/coral_dev_board_mini.py
index b0b425cd..79e7fa61 100644
--- a/src/adafruit_blinka/board/coral_dev_board_mini.py
+++ b/src/adafruit_blinka/board/coral_dev_board_mini.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Coral Dev Board Mini."""
 
 from adafruit_blinka.microcontroller.mt8167 import pin
diff --git a/src/adafruit_blinka/board/dragonboard_410c.py b/src/adafruit_blinka/board/dragonboard_410c.py
index aa42ce05..a627309d 100644
--- a/src/adafruit_blinka/board/dragonboard_410c.py
+++ b/src/adafruit_blinka/board/dragonboard_410c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Dragonboard 410c."""
 
 from adafruit_blinka.microcontroller.snapdragon.apq8016 import pin
diff --git a/src/adafruit_blinka/board/feather_huzzah.py b/src/adafruit_blinka/board/feather_huzzah.py
index 70cc1862..32bbce11 100755
--- a/src/adafruit_blinka/board/feather_huzzah.py
+++ b/src/adafruit_blinka/board/feather_huzzah.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Feather Huzzah."""
 
 from adafruit_blinka.microcontroller.esp8266 import pin
diff --git a/src/adafruit_blinka/board/feather_u2if.py b/src/adafruit_blinka/board/feather_u2if.py
index 23fe99ea..d4e6581d 100644
--- a/src/adafruit_blinka/board/feather_u2if.py
+++ b/src/adafruit_blinka/board/feather_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Pin definitions for the Feather RP2040 with u2if firmware.
 
diff --git a/src/adafruit_blinka/board/ftdi_ft2232h.py b/src/adafruit_blinka/board/ftdi_ft2232h.py
index 68491270..fcb5b1ce 100644
--- a/src/adafruit_blinka/board/ftdi_ft2232h.py
+++ b/src/adafruit_blinka/board/ftdi_ft2232h.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the FTDI FT2232H"""
 from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h import pin
 
diff --git a/src/adafruit_blinka/board/ftdi_ft232h.py b/src/adafruit_blinka/board/ftdi_ft232h.py
index 1d6a8672..11bbce5f 100644
--- a/src/adafruit_blinka/board/ftdi_ft232h.py
+++ b/src/adafruit_blinka/board/ftdi_ft232h.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the FTDI FT232H"""
 from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h import pin
 
diff --git a/src/adafruit_blinka/board/giantboard.py b/src/adafruit_blinka/board/giantboard.py
index 82fc9256..dfbe1c21 100644
--- a/src/adafruit_blinka/board/giantboard.py
+++ b/src/adafruit_blinka/board/giantboard.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Giant Board"""
 from adafruit_blinka.microcontroller.sama5 import pin
 
diff --git a/src/adafruit_blinka/board/greatfet_one.py b/src/adafruit_blinka/board/greatfet_one.py
index 87a5173c..0279c30e 100644
--- a/src/adafruit_blinka/board/greatfet_one.py
+++ b/src/adafruit_blinka/board/greatfet_one.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the GreatFET One"""
 from adafruit_blinka.microcontroller.nxp_lpc4330 import pin
 
diff --git a/src/adafruit_blinka/board/hardkernel/__init__.py b/src/adafruit_blinka/board/hardkernel/__init__.py
index 4828ef7c..a4130319 100644
--- a/src/adafruit_blinka/board/hardkernel/__init__.py
+++ b/src/adafruit_blinka/board/hardkernel/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from HardKernel"""
diff --git a/src/adafruit_blinka/board/hardkernel/odroidc2.py b/src/adafruit_blinka/board/hardkernel/odroidc2.py
index 75596ede..00645453 100644
--- a/src/adafruit_blinka/board/hardkernel/odroidc2.py
+++ b/src/adafruit_blinka/board/hardkernel/odroidc2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Odroid C2."""
 
 from adafruit_blinka.microcontroller.amlogic.s905 import pin
diff --git a/src/adafruit_blinka/board/hardkernel/odroidc4.py b/src/adafruit_blinka/board/hardkernel/odroidc4.py
index 27ccae8a..2191013e 100644
--- a/src/adafruit_blinka/board/hardkernel/odroidc4.py
+++ b/src/adafruit_blinka/board/hardkernel/odroidc4.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Odroid C4."""
 
 from adafruit_blinka.microcontroller.amlogic.s905x3 import pin
diff --git a/src/adafruit_blinka/board/hardkernel/odroidn2.py b/src/adafruit_blinka/board/hardkernel/odroidn2.py
index a5339589..4abce5b4 100644
--- a/src/adafruit_blinka/board/hardkernel/odroidn2.py
+++ b/src/adafruit_blinka/board/hardkernel/odroidn2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Odroid N2."""
 
 from adafruit_blinka.microcontroller.amlogic.s922x import pin
diff --git a/src/adafruit_blinka/board/hardkernel/odroidxu4.py b/src/adafruit_blinka/board/hardkernel/odroidxu4.py
index b052f7eb..b53d1d82 100644
--- a/src/adafruit_blinka/board/hardkernel/odroidxu4.py
+++ b/src/adafruit_blinka/board/hardkernel/odroidxu4.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Odroid XU4."""
 
 from adafruit_blinka.microcontroller.samsung.exynos5422 import pin
diff --git a/src/adafruit_blinka/board/hifive_unleashed.py b/src/adafruit_blinka/board/hifive_unleashed.py
index 4a04046b..50fc12e5 100644
--- a/src/adafruit_blinka/board/hifive_unleashed.py
+++ b/src/adafruit_blinka/board/hifive_unleashed.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Hifive Unleashed."""
 
 from adafruit_blinka.microcontroller.hfu540 import pin
diff --git a/src/adafruit_blinka/board/itsybitsy_u2if.py b/src/adafruit_blinka/board/itsybitsy_u2if.py
index c13d24cd..f0490788 100644
--- a/src/adafruit_blinka/board/itsybitsy_u2if.py
+++ b/src/adafruit_blinka/board/itsybitsy_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Pin definitions for the ItsyBitsy RP2040 with u2if firmware.
 
diff --git a/src/adafruit_blinka/board/lubancat/__init__.py b/src/adafruit_blinka/board/lubancat/__init__.py
index d56e3eab..7c66a935 100644
--- a/src/adafruit_blinka/board/lubancat/__init__.py
+++ b/src/adafruit_blinka/board/lubancat/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from LubanCat"""
diff --git a/src/adafruit_blinka/board/lubancat/lubancat_imx6ull.py b/src/adafruit_blinka/board/lubancat/lubancat_imx6ull.py
index 26a32219..d1cb16ab 100644
--- a/src/adafruit_blinka/board/lubancat/lubancat_imx6ull.py
+++ b/src/adafruit_blinka/board/lubancat/lubancat_imx6ull.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the LubanCat IMX6ULL."""
 
 from adafruit_blinka.microcontroller.nxp_imx6ull import pin
diff --git a/src/adafruit_blinka/board/lubancat/lubancat_stm32mp157.py b/src/adafruit_blinka/board/lubancat/lubancat_stm32mp157.py
index 33dfdcd6..1439b849 100644
--- a/src/adafruit_blinka/board/lubancat/lubancat_stm32mp157.py
+++ b/src/adafruit_blinka/board/lubancat/lubancat_stm32mp157.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the LubanCat STM32MP157."""
 
 from adafruit_blinka.microcontroller.stm32.stm32mp157 import pin
diff --git a/src/adafruit_blinka/board/macropad_u2if.py b/src/adafruit_blinka/board/macropad_u2if.py
index 64b671b6..314daf9c 100644
--- a/src/adafruit_blinka/board/macropad_u2if.py
+++ b/src/adafruit_blinka/board/macropad_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Pin definitions for the MacroPad RP2040 with u2if firmware.
 
diff --git a/src/adafruit_blinka/board/microchip_mcp2221.py b/src/adafruit_blinka/board/microchip_mcp2221.py
index b9580b66..bbfcc508 100644
--- a/src/adafruit_blinka/board/microchip_mcp2221.py
+++ b/src/adafruit_blinka/board/microchip_mcp2221.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the MicroChip MCP2221"""
 from adafruit_blinka.microcontroller.mcp2221 import pin
 
diff --git a/src/adafruit_blinka/board/nanopi/__init__.py b/src/adafruit_blinka/board/nanopi/__init__.py
index 64e3b6c5..5fe7ee98 100644
--- a/src/adafruit_blinka/board/nanopi/__init__.py
+++ b/src/adafruit_blinka/board/nanopi/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Board definitions from NanoPi"""
diff --git a/src/adafruit_blinka/board/nanopi/duo2.py b/src/adafruit_blinka/board/nanopi/duo2.py
index 368c9395..6e4dae5d 100644
--- a/src/adafruit_blinka/board/nanopi/duo2.py
+++ b/src/adafruit_blinka/board/nanopi/duo2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the NanoPi Duo2."""
 # Enable I2C0, UART1, and SPI by adding the following lines to /boot/armbianEnv.txt
 #    overlays=usbhost2 usbhost3 spi-spidev uart1 i2c0
diff --git a/src/adafruit_blinka/board/nanopi/neo.py b/src/adafruit_blinka/board/nanopi/neo.py
index 68b5cbed..35100d04 100644
--- a/src/adafruit_blinka/board/nanopi/neo.py
+++ b/src/adafruit_blinka/board/nanopi/neo.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the NanoPi NEO Air."""
 # Enable I2C0, UART1, and SPI by adding the following lines to /boot/armbianEnv.txt
 #    overlays=usbhost2 usbhost3 spi-spidev uart1 i2c0
diff --git a/src/adafruit_blinka/board/nanopi/neoair.py b/src/adafruit_blinka/board/nanopi/neoair.py
index 68b5cbed..35100d04 100644
--- a/src/adafruit_blinka/board/nanopi/neoair.py
+++ b/src/adafruit_blinka/board/nanopi/neoair.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the NanoPi NEO Air."""
 # Enable I2C0, UART1, and SPI by adding the following lines to /boot/armbianEnv.txt
 #    overlays=usbhost2 usbhost3 spi-spidev uart1 i2c0
diff --git a/src/adafruit_blinka/board/nodemcu.py b/src/adafruit_blinka/board/nodemcu.py
index 256e836b..a6fceca8 100755
--- a/src/adafruit_blinka/board/nodemcu.py
+++ b/src/adafruit_blinka/board/nodemcu.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """NodeMCU pin names"""
 
 from adafruit_blinka.microcontroller.esp8266 import pin
diff --git a/src/adafruit_blinka/board/nvidia/__init__.py b/src/adafruit_blinka/board/nvidia/__init__.py
index 69cb70e7..7e58d0d9 100644
--- a/src/adafruit_blinka/board/nvidia/__init__.py
+++ b/src/adafruit_blinka/board/nvidia/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from NVIDIA"""
diff --git a/src/adafruit_blinka/board/nvidia/clara_agx_xavier.py b/src/adafruit_blinka/board/nvidia/clara_agx_xavier.py
index d65e95a4..420247eb 100644
--- a/src/adafruit_blinka/board/nvidia/clara_agx_xavier.py
+++ b/src/adafruit_blinka/board/nvidia/clara_agx_xavier.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Clara AGX Xavier."""
 
 from adafruit_blinka.microcontroller.tegra.t194 import pin
diff --git a/src/adafruit_blinka/board/nvidia/jetson_nano.py b/src/adafruit_blinka/board/nvidia/jetson_nano.py
index 8b9b77cb..d4e03ac2 100644
--- a/src/adafruit_blinka/board/nvidia/jetson_nano.py
+++ b/src/adafruit_blinka/board/nvidia/jetson_nano.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Jetson Nano."""
 
 from adafruit_blinka.microcontroller.tegra.t210 import pin
diff --git a/src/adafruit_blinka/board/nvidia/jetson_nx.py b/src/adafruit_blinka/board/nvidia/jetson_nx.py
index fad7c41b..0323f6b5 100644
--- a/src/adafruit_blinka/board/nvidia/jetson_nx.py
+++ b/src/adafruit_blinka/board/nvidia/jetson_nx.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Jetson NX."""
 
 from adafruit_blinka.microcontroller.tegra.t194 import pin
diff --git a/src/adafruit_blinka/board/nvidia/jetson_tx1.py b/src/adafruit_blinka/board/nvidia/jetson_tx1.py
index cfa70dcc..77efaecd 100644
--- a/src/adafruit_blinka/board/nvidia/jetson_tx1.py
+++ b/src/adafruit_blinka/board/nvidia/jetson_tx1.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Jetson TX1."""
 
 from adafruit_blinka.microcontroller.tegra.t210 import pin
diff --git a/src/adafruit_blinka/board/nvidia/jetson_tx2.py b/src/adafruit_blinka/board/nvidia/jetson_tx2.py
index d0431765..9597610d 100644
--- a/src/adafruit_blinka/board/nvidia/jetson_tx2.py
+++ b/src/adafruit_blinka/board/nvidia/jetson_tx2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Jetson TX2."""
 
 from adafruit_blinka.microcontroller.tegra.t186 import pin
diff --git a/src/adafruit_blinka/board/nvidia/jetson_tx2_nx.py b/src/adafruit_blinka/board/nvidia/jetson_tx2_nx.py
index ff5c1545..0f1698ce 100644
--- a/src/adafruit_blinka/board/nvidia/jetson_tx2_nx.py
+++ b/src/adafruit_blinka/board/nvidia/jetson_tx2_nx.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Jetson TX2 NX."""
 
 from adafruit_blinka.microcontroller.tegra.t186 import pin
diff --git a/src/adafruit_blinka/board/nvidia/jetson_xavier.py b/src/adafruit_blinka/board/nvidia/jetson_xavier.py
index 29105822..d55bb82b 100644
--- a/src/adafruit_blinka/board/nvidia/jetson_xavier.py
+++ b/src/adafruit_blinka/board/nvidia/jetson_xavier.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Jetson XAVIER."""
 
 from adafruit_blinka.microcontroller.tegra.t194 import pin
diff --git a/src/adafruit_blinka/board/onion/__init__.py b/src/adafruit_blinka/board/onion/__init__.py
index ab79770c..19abbb32 100644
--- a/src/adafruit_blinka/board/onion/__init__.py
+++ b/src/adafruit_blinka/board/onion/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from Onion"""
diff --git a/src/adafruit_blinka/board/onion/omega2.py b/src/adafruit_blinka/board/onion/omega2.py
index 6754d359..3574eb52 100644
--- a/src/adafruit_blinka/board/onion/omega2.py
+++ b/src/adafruit_blinka/board/onion/omega2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Onion Omega2+ Expansion Dock."""
 
 from adafruit_blinka.microcontroller.mips24kec import pin
diff --git a/src/adafruit_blinka/board/orangepi/__init__.py b/src/adafruit_blinka/board/orangepi/__init__.py
index 640a5b3f..0333f98d 100644
--- a/src/adafruit_blinka/board/orangepi/__init__.py
+++ b/src/adafruit_blinka/board/orangepi/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from Xunlong Orange Pi"""
diff --git a/src/adafruit_blinka/board/orangepi/orangepi3.py b/src/adafruit_blinka/board/orangepi/orangepi3.py
index ad609656..ea3acd76 100644
--- a/src/adafruit_blinka/board/orangepi/orangepi3.py
+++ b/src/adafruit_blinka/board/orangepi/orangepi3.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi 3."""
 
 from adafruit_blinka.microcontroller.allwinner.h6 import pin
diff --git a/src/adafruit_blinka/board/orangepi/orangepipc.py b/src/adafruit_blinka/board/orangepi/orangepipc.py
index e7c4fdac..58830a0e 100644
--- a/src/adafruit_blinka/board/orangepi/orangepipc.py
+++ b/src/adafruit_blinka/board/orangepi/orangepipc.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi PC."""
 
 from adafruit_blinka.microcontroller.allwinner.h3 import pin
diff --git a/src/adafruit_blinka/board/orangepi/orangepir1.py b/src/adafruit_blinka/board/orangepi/orangepir1.py
index 0752c514..27b3ce80 100644
--- a/src/adafruit_blinka/board/orangepi/orangepir1.py
+++ b/src/adafruit_blinka/board/orangepi/orangepir1.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi R1."""
 
 from adafruit_blinka.microcontroller.allwinner.h3 import pin
diff --git a/src/adafruit_blinka/board/orangepi/orangepizero.py b/src/adafruit_blinka/board/orangepi/orangepizero.py
index b0dadeef..6e4155a1 100644
--- a/src/adafruit_blinka/board/orangepi/orangepizero.py
+++ b/src/adafruit_blinka/board/orangepi/orangepizero.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi Zero."""
 
 # The Orange Pi Zero uses the AllWinner H2 SoC, but pins
diff --git a/src/adafruit_blinka/board/orangepi/orangepizero2.py b/src/adafruit_blinka/board/orangepi/orangepizero2.py
index 79f5d8eb..662e2cee 100644
--- a/src/adafruit_blinka/board/orangepi/orangepizero2.py
+++ b/src/adafruit_blinka/board/orangepi/orangepizero2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi Zero 2."""
 
 from adafruit_blinka.microcontroller.allwinner.h616 import pin
diff --git a/src/adafruit_blinka/board/orangepi/orangepizeroplus.py b/src/adafruit_blinka/board/orangepi/orangepizeroplus.py
index 36ed7f33..d8fcd3b7 100644
--- a/src/adafruit_blinka/board/orangepi/orangepizeroplus.py
+++ b/src/adafruit_blinka/board/orangepi/orangepizeroplus.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi Zero Plus."""
 
 from adafruit_blinka.microcontroller.allwinner.h5 import pin
diff --git a/src/adafruit_blinka/board/orangepi/orangepizeroplus2h5.py b/src/adafruit_blinka/board/orangepi/orangepizeroplus2h5.py
index c82b6926..507b0217 100644
--- a/src/adafruit_blinka/board/orangepi/orangepizeroplus2h5.py
+++ b/src/adafruit_blinka/board/orangepi/orangepizeroplus2h5.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Orange Pi Zero Plus 2 H5."""
 
 from adafruit_blinka.microcontroller.allwinner.h5 import pin
diff --git a/src/adafruit_blinka/board/pico_u2if.py b/src/adafruit_blinka/board/pico_u2if.py
index 6564ed38..bf131b4f 100644
--- a/src/adafruit_blinka/board/pico_u2if.py
+++ b/src/adafruit_blinka/board/pico_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Raspberry Pi Pico running u2if firmware"""
 from adafruit_blinka.microcontroller.rp2040_u2if import pin
 
diff --git a/src/adafruit_blinka/board/pine64.py b/src/adafruit_blinka/board/pine64.py
index 5a66f975..2ed3024e 100644
--- a/src/adafruit_blinka/board/pine64.py
+++ b/src/adafruit_blinka/board/pine64.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Pine64."""
 
 from adafruit_blinka.microcontroller.allwinner.a64 import pin
diff --git a/src/adafruit_blinka/board/pineH64.py b/src/adafruit_blinka/board/pineH64.py
index 9a513624..54e28713 100644
--- a/src/adafruit_blinka/board/pineH64.py
+++ b/src/adafruit_blinka/board/pineH64.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the PineH64."""
 
 from adafruit_blinka.microcontroller.allwinner.h6 import pin
diff --git a/src/adafruit_blinka/board/pyboard.py b/src/adafruit_blinka/board/pyboard.py
index 14ed9575..d6459537 100755
--- a/src/adafruit_blinka/board/pyboard.py
+++ b/src/adafruit_blinka/board/pyboard.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """PyBoard pin names"""
 
 from adafruit_blinka.microcontroller.stm32.stm32f405 import pin
diff --git a/src/adafruit_blinka/board/qt2040_trinkey_u2if.py b/src/adafruit_blinka/board/qt2040_trinkey_u2if.py
index d71bea8c..c80b67b0 100644
--- a/src/adafruit_blinka/board/qt2040_trinkey_u2if.py
+++ b/src/adafruit_blinka/board/qt2040_trinkey_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the QT2040 Trinkey with u2if firmware."""
 
 from adafruit_blinka.microcontroller.rp2040_u2if import pin
diff --git a/src/adafruit_blinka/board/qtpy_u2if.py b/src/adafruit_blinka/board/qtpy_u2if.py
index 569ace23..1958777d 100644
--- a/src/adafruit_blinka/board/qtpy_u2if.py
+++ b/src/adafruit_blinka/board/qtpy_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Pin definitions for the QT Py RP2040 with u2if firmware.
 
diff --git a/src/adafruit_blinka/board/radxa/__init__.py b/src/adafruit_blinka/board/radxa/__init__.py
index b1b4b8c4..a7b5c74f 100644
--- a/src/adafruit_blinka/board/radxa/__init__.py
+++ b/src/adafruit_blinka/board/radxa/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Rock Pi Boards definition from Radxa"""
diff --git a/src/adafruit_blinka/board/radxa/rockpi4.py b/src/adafruit_blinka/board/radxa/rockpi4.py
index e327ff3a..9c046701 100644
--- a/src/adafruit_blinka/board/radxa/rockpi4.py
+++ b/src/adafruit_blinka/board/radxa/rockpi4.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Rock Pi 4."""
 
 from adafruit_blinka.microcontroller.rockchip.rk3399 import pin
diff --git a/src/adafruit_blinka/board/radxa/rockpie.py b/src/adafruit_blinka/board/radxa/rockpie.py
index f5a5a747..3233d477 100644
--- a/src/adafruit_blinka/board/radxa/rockpie.py
+++ b/src/adafruit_blinka/board/radxa/rockpie.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Rock Pi E."""
 
 from adafruit_blinka.microcontroller.rockchip.rk3328 import pin
diff --git a/src/adafruit_blinka/board/radxa/rockpis.py b/src/adafruit_blinka/board/radxa/rockpis.py
index bf147d7b..c967d97b 100644
--- a/src/adafruit_blinka/board/radxa/rockpis.py
+++ b/src/adafruit_blinka/board/radxa/rockpis.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Rock Pi S."""
 
 from adafruit_blinka.microcontroller.rockchip.rk3308 import pin
diff --git a/src/adafruit_blinka/board/raspberrypi/__init__.py b/src/adafruit_blinka/board/raspberrypi/__init__.py
index 0969dbf3..a39c1db1 100644
--- a/src/adafruit_blinka/board/raspberrypi/__init__.py
+++ b/src/adafruit_blinka/board/raspberrypi/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from Raspberry Pi"""
diff --git a/src/adafruit_blinka/board/raspberrypi/pico.py b/src/adafruit_blinka/board/raspberrypi/pico.py
index e554ad19..9885d437 100755
--- a/src/adafruit_blinka/board/raspberrypi/pico.py
+++ b/src/adafruit_blinka/board/raspberrypi/pico.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Raspberry Pi Pico pin names"""
 
 from adafruit_blinka.microcontroller.rp2040 import pin
diff --git a/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev1.py b/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev1.py
index 59168dc6..71b390f8 100644
--- a/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev1.py
+++ b/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev1.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Raspberry Pi Model B Revision 1."""
 
 from adafruit_blinka.microcontroller.bcm283x import pin
diff --git a/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev2.py b/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev2.py
index 47fc39b3..51efd0f6 100644
--- a/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev2.py
+++ b/src/adafruit_blinka/board/raspberrypi/raspi_1b_rev2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Raspberry Pi Model B Revision 2."""
 
 from adafruit_blinka.microcontroller.bcm283x import pin
diff --git a/src/adafruit_blinka/board/raspberrypi/raspi_40pin.py b/src/adafruit_blinka/board/raspberrypi/raspi_40pin.py
index 91347e04..95414768 100644
--- a/src/adafruit_blinka/board/raspberrypi/raspi_40pin.py
+++ b/src/adafruit_blinka/board/raspberrypi/raspi_40pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for 40-pin Raspberry Pi models."""
 
 from adafruit_blinka.microcontroller.bcm283x import pin
diff --git a/src/adafruit_blinka/board/raspberrypi/raspi_4b.py b/src/adafruit_blinka/board/raspberrypi/raspi_4b.py
index 9fbb6cae..ffd49792 100644
--- a/src/adafruit_blinka/board/raspberrypi/raspi_4b.py
+++ b/src/adafruit_blinka/board/raspberrypi/raspi_4b.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Raspberry Pi 4 models using the BCM2711."""
 
 from adafruit_blinka.microcontroller.bcm2711 import pin
diff --git a/src/adafruit_blinka/board/raspberrypi/raspi_cm.py b/src/adafruit_blinka/board/raspberrypi/raspi_cm.py
index 33801787..dbe7ccf5 100644
--- a/src/adafruit_blinka/board/raspberrypi/raspi_cm.py
+++ b/src/adafruit_blinka/board/raspberrypi/raspi_cm.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Raspberry Pi Compute Modules."""
 
 from adafruit_blinka.microcontroller.bcm283x import pin
diff --git a/src/adafruit_blinka/board/soPine.py b/src/adafruit_blinka/board/soPine.py
index 00ba5b62..fbd5e592 100644
--- a/src/adafruit_blinka/board/soPine.py
+++ b/src/adafruit_blinka/board/soPine.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the SoPine."""
 
 from adafruit_blinka.microcontroller.allwinner.a64 import pin
diff --git a/src/adafruit_blinka/board/stm32/__init__.py b/src/adafruit_blinka/board/stm32/__init__.py
index d0e9d459..b1036dc8 100644
--- a/src/adafruit_blinka/board/stm32/__init__.py
+++ b/src/adafruit_blinka/board/stm32/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Boards definition from STM32"""
diff --git a/src/adafruit_blinka/board/stm32/osd32mp1_brk.py b/src/adafruit_blinka/board/stm32/osd32mp1_brk.py
index 3fa9e468..6687f182 100644
--- a/src/adafruit_blinka/board/stm32/osd32mp1_brk.py
+++ b/src/adafruit_blinka/board/stm32/osd32mp1_brk.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Octavo OSD32MP1 BRK board."""
 
 # See: https://octavosystems.com/octavosystems.com/wp-content/uploads/2020/05/Default-Pin-Mapping.pdf  # pylint: disable=line-too-long
diff --git a/src/adafruit_blinka/board/stm32/osd32mp1_red.py b/src/adafruit_blinka/board/stm32/osd32mp1_red.py
index 67395f97..6879c624 100644
--- a/src/adafruit_blinka/board/stm32/osd32mp1_red.py
+++ b/src/adafruit_blinka/board/stm32/osd32mp1_red.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Octavo OSD32MP1 RED board."""
 
 from adafruit_blinka.microcontroller.stm32.stm32mp157 import pin
diff --git a/src/adafruit_blinka/board/stm32/stm32mp157c_dk2.py b/src/adafruit_blinka/board/stm32/stm32mp157c_dk2.py
index 2f8cde17..dd427870 100644
--- a/src/adafruit_blinka/board/stm32/stm32mp157c_dk2.py
+++ b/src/adafruit_blinka/board/stm32/stm32mp157c_dk2.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the STM32MP157C Development Kit 2."""
 
 from adafruit_blinka.microcontroller.stm32.stm32mp157 import pin
diff --git a/src/adafruit_blinka/board/tritium-h3.py b/src/adafruit_blinka/board/tritium-h3.py
index 516528ab..ce25dc98 100644
--- a/src/adafruit_blinka/board/tritium-h3.py
+++ b/src/adafruit_blinka/board/tritium-h3.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for the Tritium H3."""
 
 from adafruit_blinka.microcontroller.allwinner.h3 import pin
diff --git a/src/adafruit_blinka/board/udoo_x86ultra.py b/src/adafruit_blinka/board/udoo_x86ultra.py
index 744d7744..a4bf1ce6 100644
--- a/src/adafruit_blinka/board/udoo_x86ultra.py
+++ b/src/adafruit_blinka/board/udoo_x86ultra.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pin definitions for Udoo x86 Ultra
 (should work for Ultra and Ultra II)
 
diff --git a/src/adafruit_blinka/microcontroller/allwinner/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/__init__.py
index a086f847..b95dd934 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition of all Allwinner chips"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/a33/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/a33/__init__.py
index bd5f1feb..79724d0f 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/a33/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/a33/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the AllWinner A33 chip"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/a33/pin.py b/src/adafruit_blinka/microcontroller/allwinner/a33/pin.py
index fc88401e..87200af4 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/a33/pin.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/a33/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allwinner A33 pin names"""
 
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/allwinner/a64/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/a64/__init__.py
index 7dbcd8c9..3ee166a9 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/a64/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/a64/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the AllWinner A64 chip"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/a64/pin.py b/src/adafruit_blinka/microcontroller/allwinner/a64/pin.py
index e362728b..77428111 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/a64/pin.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/a64/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allwinner A64 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h3/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/h3/__init__.py
index 80bc28f0..d50b214f 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h3/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h3/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the AllWinner H3 chip"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h3/pin.py b/src/adafruit_blinka/microcontroller/allwinner/h3/pin.py
index 0bed0510..b81c7434 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h3/pin.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h3/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allwinner H3 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h5/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/h5/__init__.py
index d5658bae..09cd4918 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h5/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h5/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the AllWinner H5 chip"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h5/pin.py b/src/adafruit_blinka/microcontroller/allwinner/h5/pin.py
index 5ab66e8c..16b035db 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h5/pin.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h5/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allwinner H5 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h6/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/h6/__init__.py
index 0eabf00e..e6b43a7f 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h6/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h6/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the AllWinner H6 chip"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h6/pin.py b/src/adafruit_blinka/microcontroller/allwinner/h6/pin.py
index 63759382..5e183a22 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h6/pin.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h6/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allwinner H6 Pin Names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h616/__init__.py b/src/adafruit_blinka/microcontroller/allwinner/h616/__init__.py
index 82e66ce0..10649779 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h616/__init__.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h616/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the AllWinner H616 chip"""
diff --git a/src/adafruit_blinka/microcontroller/allwinner/h616/pin.py b/src/adafruit_blinka/microcontroller/allwinner/h616/pin.py
index 5c046d1a..3ee5a9c9 100644
--- a/src/adafruit_blinka/microcontroller/allwinner/h616/pin.py
+++ b/src/adafruit_blinka/microcontroller/allwinner/h616/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Allwinner H616 Pin Names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/am335x/pin.py b/src/adafruit_blinka/microcontroller/am335x/pin.py
index 1553ff23..09868495 100644
--- a/src/adafruit_blinka/microcontroller/am335x/pin.py
+++ b/src/adafruit_blinka/microcontroller/am335x/pin.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """AM335x pin names"""
-import Adafruit_BBIO.GPIO as GPIO
+from Adafruit_BBIO import GPIO
 
 
 class Pin:
diff --git a/src/adafruit_blinka/microcontroller/am335x/sysfs_pwmout.py b/src/adafruit_blinka/microcontroller/am335x/sysfs_pwmout.py
index b99e1cc8..776f9bb4 100644
--- a/src/adafruit_blinka/microcontroller/am335x/sysfs_pwmout.py
+++ b/src/adafruit_blinka/microcontroller/am335x/sysfs_pwmout.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Much code from https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py
 Copyright (c) 2015-2016 vsergeev / Ivan (Vanya) A. Sergeev
@@ -101,7 +104,7 @@ def _open(self, pin, duty=0, freq=500, variable_frequency=False):
         if not os.path.isdir(pin_path):
             try:
                 with open(
-                    os.path.join(channel_path, self._export_path), "w"
+                    os.path.join(channel_path, self._export_path), "w", encoding="utf-8"
                 ) as f_export:
                     f_export.write("%d\n" % self._pwmpin)
             except IOError as e:
@@ -131,7 +134,9 @@ def deinit(self):
                 try:
                     # unexport_path = os.path.join(channel_path, self._unexport_path)
                     with open(
-                        os.path.join(channel_path, self._unexport_path), "w"
+                        os.path.join(channel_path, self._unexport_path),
+                        "w",
+                        encoding="utf-8",
                     ) as f_unexport:
                         f_unexport.write("%d\n" % self._pwmpin)
                 except IOError as e:
@@ -170,7 +175,7 @@ def _write_pin_attr(self, attr, value):
             attr,
         )
 
-        with open(path, "w") as f_attr:
+        with open(path, "w", encoding="utf-8") as f_attr:
             f_attr.write(value + "\n")
 
     def _read_pin_attr(self, attr):
@@ -184,7 +189,7 @@ def _read_pin_attr(self, attr):
             attr,
         )
 
-        with open(path, "r") as f_attr:
+        with open(path, "r", encoding="utf-8") as f_attr:
             return f_attr.read().strip()
 
     # Mutable properties
diff --git a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py
index 82fa6ea2..d920b1f9 100644
--- a/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py
+++ b/src/adafruit_blinka/microcontroller/amlogic/meson_g12_common/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 G12A, G12B, and SM1 Common Definitions
 Ref:
@@ -110,7 +113,7 @@
 def get_dts_alias(device: str) -> str:
     """Get the Device Tree Alias"""
     uevent_path = "/sys/bus/platform/devices/" + device + "/uevent"
-    with open(uevent_path, "r") as fd:
+    with open(uevent_path, "r", encoding="utf-8") as fd:
         pattern = r"^OF_ALIAS_0=(.*)$"
         uevent = fd.read().split("\n")
         for line in uevent:
diff --git a/src/adafruit_blinka/microcontroller/amlogic/s905/pin.py b/src/adafruit_blinka/microcontroller/amlogic/s905/pin.py
index 346a8086..f82435d8 100644
--- a/src/adafruit_blinka/microcontroller/amlogic/s905/pin.py
+++ b/src/adafruit_blinka/microcontroller/amlogic/s905/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """AmLogic s905 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/amlogic/s905x3/pin.py b/src/adafruit_blinka/microcontroller/amlogic/s905x3/pin.py
index 378fa60e..861c72bd 100644
--- a/src/adafruit_blinka/microcontroller/amlogic/s905x3/pin.py
+++ b/src/adafruit_blinka/microcontroller/amlogic/s905x3/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """AmLogic s905x3 pin names"""
 # pylint: disable=wildcard-import,unused-wildcard-import
 from adafruit_blinka.microcontroller.amlogic.meson_g12_common.pin import *
diff --git a/src/adafruit_blinka/microcontroller/amlogic/s922x/pin.py b/src/adafruit_blinka/microcontroller/amlogic/s922x/pin.py
index b9198aea..5e2ac181 100644
--- a/src/adafruit_blinka/microcontroller/amlogic/s922x/pin.py
+++ b/src/adafruit_blinka/microcontroller/amlogic/s922x/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """AmLogic s922x pin names"""
 # pylint: disable=wildcard-import,unused-wildcard-import
 from adafruit_blinka.microcontroller.amlogic.meson_g12_common.pin import *
diff --git a/src/adafruit_blinka/microcontroller/atheros/ar9331/pin.py b/src/adafruit_blinka/microcontroller/atheros/ar9331/pin.py
index 9b563ff4..1373c92d 100644
--- a/src/adafruit_blinka/microcontroller/atheros/ar9331/pin.py
+++ b/src/adafruit_blinka/microcontroller/atheros/ar9331/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Atheros AR9331 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/bcm2711/pin.py b/src/adafruit_blinka/microcontroller/bcm2711/pin.py
index f56d5853..91b40305 100644
--- a/src/adafruit_blinka/microcontroller/bcm2711/pin.py
+++ b/src/adafruit_blinka/microcontroller/bcm2711/pin.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Broadcom BCM2711 pin names"""
-import RPi.GPIO as GPIO
+from RPi import GPIO
 from adafruit_blinka.microcontroller.bcm283x.pin import Pin
 
 GPIO.setmode(GPIO.BCM)  # Use BCM pins D4 = GPIO #4
diff --git a/src/adafruit_blinka/microcontroller/bcm283x/neopixel.py b/src/adafruit_blinka/microcontroller/bcm283x/neopixel.py
index 6c0726f8..c743220d 100644
--- a/src/adafruit_blinka/microcontroller/bcm283x/neopixel.py
+++ b/src/adafruit_blinka/microcontroller/bcm283x/neopixel.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """BCM283x NeoPixel Driver Class"""
 import time
 import atexit
diff --git a/src/adafruit_blinka/microcontroller/bcm283x/pin.py b/src/adafruit_blinka/microcontroller/bcm283x/pin.py
index 5022366a..a24ed220 100644
--- a/src/adafruit_blinka/microcontroller/bcm283x/pin.py
+++ b/src/adafruit_blinka/microcontroller/bcm283x/pin.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Broadcom BCM283x pin names"""
-import RPi.GPIO as GPIO
+from RPi import GPIO
 
 GPIO.setmode(GPIO.BCM)  # Use BCM pins D4 = GPIO #4
 GPIO.setwarnings(False)  # shh!
diff --git a/src/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py
index 700d8de2..caf0d62b 100644
--- a/src/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py
+++ b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Custom PulseIn Class to read PWM signals"""
 import time
 import subprocess
@@ -51,7 +54,7 @@ def __init__(self, pin, maxlen=2, idle_state=False):
             ) from sysv_ipc.ExistentialError
 
         # Check if OS is 64-bit
-        if struct.calcsize("P") * 8 == 64:
+        if struct.calcsize("P") * 8 == 64:  # pylint: disable=no-member
             libgpiod_filename = "libgpiod_pulsein64"
         else:
             libgpiod_filename = "libgpiod_pulsein"
@@ -71,7 +74,7 @@ def __init__(self, pin, maxlen=2, idle_state=False):
         if DEBUG:
             print(cmd)
 
-        self._process = subprocess.Popen(cmd)
+        self._process = subprocess.Popen(cmd)  # pylint: disable=consider-using-with
         procs.append(self._process)
 
         # wait for it to start up
diff --git a/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein.license b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein64.license b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein64.license
new file mode 100644
index 00000000..cc693300
--- /dev/null
+++ b/src/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein64.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/src/adafruit_blinka/microcontroller/bcm283x/pwmio/PWMOut.py b/src/adafruit_blinka/microcontroller/bcm283x/pwmio/PWMOut.py
index 65f269f5..3b7b57f1 100644
--- a/src/adafruit_blinka/microcontroller/bcm283x/pwmio/PWMOut.py
+++ b/src/adafruit_blinka/microcontroller/bcm283x/pwmio/PWMOut.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Custom PWMOut Wrapper for Rpi.GPIO PWM Class"""
-import RPi.GPIO as GPIO
+from RPi import GPIO
 
 GPIO.setmode(GPIO.BCM)  # Use BCM pins D4 = GPIO #4
 GPIO.setwarnings(False)  # shh!
diff --git a/src/adafruit_blinka/microcontroller/dra74x/pin.py b/src/adafruit_blinka/microcontroller/dra74x/pin.py
index 28738c13..3894bb6b 100644
--- a/src/adafruit_blinka/microcontroller/dra74x/pin.py
+++ b/src/adafruit_blinka/microcontroller/dra74x/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """DRA74x pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/esp8266/pin.py b/src/adafruit_blinka/microcontroller/esp8266/pin.py
index 5ba98840..5f57036e 100755
--- a/src/adafruit_blinka/microcontroller/esp8266/pin.py
+++ b/src/adafruit_blinka/microcontroller/esp8266/pin.py
@@ -1,6 +1,9 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """ESP8266 pin names"""
 
-from microcontroller import Pin
+from ..generic_micropython import Pin
 
 GPIO0 = Pin(0)
 GPIO1 = Pin(1)
diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py
index 4fa84401..d81caff4 100644
--- a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py
+++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft2232h/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """FT2232H pin names"""
 
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py
index 178979e4..2cc03370 100644
--- a/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py
+++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/ft232h/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """FT232H pin names"""
 
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py
index f9539fb4..b98c59ba 100644
--- a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py
+++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Class for FTDI MPSSE"""
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.url import (
diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py
index 1460bd5d..cf931619 100644
--- a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py
+++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """MPSSE pin names"""
 
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.url import (
diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py
index 0b76c081..66bb8fd2 100644
--- a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py
+++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SPI Class for FTDI MPSSE"""
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.pin import Pin
 from adafruit_blinka.microcontroller.ftdi_mpsse.mpsse.url import (
diff --git a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/url.py b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/url.py
index a3923ca0..e264b947 100644
--- a/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/url.py
+++ b/src/adafruit_blinka/microcontroller/ftdi_mpsse/mpsse/url.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Support for getting the URL from the BLINKA_FT232H
 and BLINKA_FT2232H_{} environment variables.
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/i2c.py b/src/adafruit_blinka/microcontroller/generic_linux/i2c.py
index bb912a5b..f6bee20c 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/i2c.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/i2c.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Generic Linux I2C class using PureIO's smbus class"""
-import Adafruit_PureIO.smbus as smbus
+from Adafruit_PureIO import smbus
 
 
 class I2C:
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py
index db9007a6..4ed61359 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """A Pin class for use with libgpiod."""
 try:
     import gpiod
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/periphery_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/periphery_pin.py
index 0986d013..2a5464dd 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/periphery_pin.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/periphery_pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """A Pin class for use with periphery."""
 try:
     from periphery import GPIO
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/spi.py b/src/adafruit_blinka/microcontroller/generic_linux/spi.py
index 45490921..50ad8c15 100755
--- a/src/adafruit_blinka/microcontroller/generic_linux/spi.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/spi.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Generic Linux SPI class using PureIO's SPI class"""
-import Adafruit_PureIO.spi as spi
+from Adafruit_PureIO import spi
 from adafruit_blinka.agnostic import detector
 
 
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogin.py b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogin.py
index e8a7376c..1b725b9a 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogin.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `analogio` - Analog input control
 =================================================
@@ -79,7 +82,7 @@ def value(self):
             self._channel_path.format(self._channel),
         )
 
-        with open(path, "r") as analog_in:
+        with open(path, "r", encoding="utf-8") as analog_in:
             return int(analog_in.read().strip())
 
     # pylint: disable=no-self-use
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py
index 56263d39..0b2d857e 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_analogout.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `analogio` - Analog output control
 =================================================
@@ -85,7 +88,7 @@ def value(self, value):
             self._channel_path.format(self._channel),
         )
 
-        with open(path, "w") as analog_out:
+        with open(path, "w", encoding="utf-8") as analog_out:
             return analog_out.write(value + "\n")
 
     def deinit(self):
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pin.py
index 50c27a7b..8ce1a65c 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pin.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Much code from https://github.com/vsergeev/python-periphery/blob/master/periphery/gpio.py
 Copyright (c) 2015-2019 vsergeev / Ivan (Vanya) A. Sergeev
@@ -132,7 +135,7 @@ def _open(self, direction):
         if not os.path.isdir(gpio_path):
             # Export the line
             try:
-                with open("/sys/class/gpio/export", "w") as f_export:
+                with open("/sys/class/gpio/export", "w", encoding="utf-8") as f_export:
                     f_export.write("{:d}\n".format(self.id))
             except IOError as e:
                 raise GPIOError(e.errno, "Exporting GPIO: " + e.strerror) from IOError
@@ -155,7 +158,9 @@ def _open(self, direction):
             # permission rule application after export
             for i in range(self.GPIO_OPEN_RETRIES):
                 try:
-                    with open(os.path.join(gpio_path, "direction"), "w") as f_direction:
+                    with open(
+                        os.path.join(gpio_path, "direction"), "w", encoding="utf-8"
+                    ) as f_direction:
                         f_direction.write(direction.lower() + "\n")
                     break
                 except IOError as e:
@@ -170,7 +175,9 @@ def _open(self, direction):
         else:
             # Write direction
             try:
-                with open(os.path.join(gpio_path, "direction"), "w") as f_direction:
+                with open(
+                    os.path.join(gpio_path, "direction"), "w", encoding="utf-8"
+                ) as f_direction:
                     f_direction.write(direction.lower() + "\n")
             except IOError as e:
                 raise GPIOError(
@@ -268,7 +275,7 @@ def chip_label(self):
         gpio_path = "/sys/class/gpio/{:s}/label".format(self.chip_name)
 
         try:
-            with open(gpio_path, "r") as f_label:
+            with open(gpio_path, "r", encoding="utf-8") as f_label:
                 label = f_label.read()
         except (GPIOError, IOError) as e:
             if isinstance(e, IOError):
@@ -287,7 +294,9 @@ def chip_label(self):
     def _get_direction(self):
         # Read direction
         try:
-            with open(os.path.join(self._path, "direction"), "r") as f_direction:
+            with open(
+                os.path.join(self._path, "direction"), "r", encoding="utf-8"
+            ) as f_direction:
                 direction = f_direction.read()
         except IOError as e:
             raise GPIOError(
@@ -304,7 +313,9 @@ def _set_direction(self, direction):
 
         # Write direction
         try:
-            with open(os.path.join(self._path, "direction"), "w") as f_direction:
+            with open(
+                os.path.join(self._path, "direction"), "w", encoding="utf-8"
+            ) as f_direction:
                 f_direction.write(direction.lower() + "\n")
         except IOError as e:
             raise GPIOError(
diff --git a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pwmout.py b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pwmout.py
index f751b71a..4aca0a27 100644
--- a/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pwmout.py
+++ b/src/adafruit_blinka/microcontroller/generic_linux/sysfs_pwmout.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Much code from https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py
 Copyright (c) 2015-2016 vsergeev / Ivan (Vanya) A. Sergeev
@@ -105,13 +108,15 @@ def _open(self, pin, duty=0, freq=500, variable_frequency=False):
 
         try:
             with open(
-                os.path.join(channel_path, self._unexport_path), "w"
+                os.path.join(channel_path, self._unexport_path), "w", encoding="utf-8"
             ) as f_unexport:
                 f_unexport.write("%d\n" % self._pwmpin)
-        except IOError as e:
+        except IOError:
             pass  # not unusual, it doesnt already exist
         try:
-            with open(os.path.join(channel_path, self._export_path), "w") as f_export:
+            with open(
+                os.path.join(channel_path, self._export_path), "w", encoding="utf-8"
+            ) as f_export:
                 f_export.write("%d\n" % self._pwmpin)
         except IOError as e:
             raise PWMError(e.errno, "Exporting PWM pin: " + e.strerror) from IOError
@@ -126,6 +131,7 @@ def _open(self, pin, duty=0, freq=500, variable_frequency=False):
                         channel_path, self._pin_path.format(self._pwmpin), "period"
                     ),
                     "w",
+                    encoding="utf-8",
                 ):
                     break
             except IOError as e:
@@ -158,7 +164,9 @@ def deinit(self):
                     self._sysfs_path, self._channel_path.format(self._channel)
                 )
                 with open(
-                    os.path.join(channel_path, self._unexport_path), "w"
+                    os.path.join(channel_path, self._unexport_path),
+                    "w",
+                    encoding="utf-8",
                 ) as f_unexport:
                     f_unexport.write("%d\n" % self._pwmpin)
             except IOError as e:
@@ -187,7 +195,7 @@ def _write_pin_attr(self, attr, value):
             attr,
         )
 
-        with open(path, "w") as f_attr:
+        with open(path, "w", encoding="utf-8") as f_attr:
             # print(value, path)
             f_attr.write(value + "\n")
 
@@ -202,7 +210,7 @@ def _read_pin_attr(self, attr):
             attr,
         )
 
-        with open(path, "r") as f_attr:
+        with open(path, "r", encoding="utf-8") as f_attr:
             return f_attr.read().strip()
 
     # Mutable properties
diff --git a/src/adafruit_blinka/microcontroller/generic_micropython/__init__.py b/src/adafruit_blinka/microcontroller/generic_micropython/__init__.py
index e69de29b..cb3683c4 100644
--- a/src/adafruit_blinka/microcontroller/generic_micropython/__init__.py
+++ b/src/adafruit_blinka/microcontroller/generic_micropython/__init__.py
@@ -0,0 +1,33 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+"""Genereic Pin class for use with MicroPython boards"""
+from adafruit_blinka import Enum
+
+
+class Pin(Enum):
+    """
+    Identifies an IO pin on the microcontroller.
+
+    They are fixed by the hardware so they cannot be constructed on demand. Instead, use board or
+    microcontroller.pin to reference the desired pin.
+    """
+
+    def __init__(self, pin_id):
+        """Identifier for pin, referencing platform-specific pin id"""
+        self.id = pin_id
+
+    def __repr__(self):
+        # pylint: disable=import-outside-toplevel, cyclic-import
+        import board
+        import microcontroller.pin
+
+        for key in dir(board):
+            if getattr(board, key) is self:
+                return "board.{}".format(key)
+        # pylint: enable=import-outside-toplevel, cyclic-import
+
+        for key in dir(microcontroller.pin):
+            if getattr(microcontroller.pin, key) is self:
+                return "microcontroller.pin.{}".format(key)
+        return repr(self)
diff --git a/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py b/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py
index 20e5f9ea..20362337 100755
--- a/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py
+++ b/src/adafruit_blinka/microcontroller/generic_micropython/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Class for Generic MicroPython"""
 from machine import I2C as _I2C
 
diff --git a/src/adafruit_blinka/microcontroller/generic_micropython/spi.py b/src/adafruit_blinka/microcontroller/generic_micropython/spi.py
index 7842a192..b8979515 100755
--- a/src/adafruit_blinka/microcontroller/generic_micropython/spi.py
+++ b/src/adafruit_blinka/microcontroller/generic_micropython/spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SPI Class for Generic MicroPython"""
 from machine import SPI as _SPI
 
diff --git a/src/adafruit_blinka/microcontroller/hfu540/pin.py b/src/adafruit_blinka/microcontroller/hfu540/pin.py
index 954b44ba..63c85bd4 100644
--- a/src/adafruit_blinka/microcontroller/hfu540/pin.py
+++ b/src/adafruit_blinka/microcontroller/hfu540/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Hifive Unleashed pin names"""
 
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/mcp2221/analogio.py b/src/adafruit_blinka/microcontroller/mcp2221/analogio.py
index 3025202f..03e7b661 100644
--- a/src/adafruit_blinka/microcontroller/mcp2221/analogio.py
+++ b/src/adafruit_blinka/microcontroller/mcp2221/analogio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `analogio` - Analog input and output control
 =================================================
diff --git a/src/adafruit_blinka/microcontroller/mcp2221/i2c.py b/src/adafruit_blinka/microcontroller/mcp2221/i2c.py
index e320ac1f..d8e40c22 100644
--- a/src/adafruit_blinka/microcontroller/mcp2221/i2c.py
+++ b/src/adafruit_blinka/microcontroller/mcp2221/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Class for MCP2221"""
 from .mcp2221 import mcp2221
 
diff --git a/src/adafruit_blinka/microcontroller/mcp2221/mcp2221.py b/src/adafruit_blinka/microcontroller/mcp2221/mcp2221.py
index fb9edf3e..7b62c3f5 100644
--- a/src/adafruit_blinka/microcontroller/mcp2221/mcp2221.py
+++ b/src/adafruit_blinka/microcontroller/mcp2221/mcp2221.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Chip Definition for MCP2221"""
 
 import os
diff --git a/src/adafruit_blinka/microcontroller/mcp2221/pin.py b/src/adafruit_blinka/microcontroller/mcp2221/pin.py
index f5e73bb6..bf4ba970 100644
--- a/src/adafruit_blinka/microcontroller/mcp2221/pin.py
+++ b/src/adafruit_blinka/microcontroller/mcp2221/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """MCP2221 pin names"""
 from .mcp2221 import mcp2221
 
diff --git a/src/adafruit_blinka/microcontroller/mips24kec/pin.py b/src/adafruit_blinka/microcontroller/mips24kec/pin.py
index 8181a0fd..246aa0df 100644
--- a/src/adafruit_blinka/microcontroller/mips24kec/pin.py
+++ b/src/adafruit_blinka/microcontroller/mips24kec/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """MIPS 24kec pin names"""
 from adafruit_blinka.microcontroller.generic_linux.periphery_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/mt8167/pin.py b/src/adafruit_blinka/microcontroller/mt8167/pin.py
index ff5e0e57..91e1ba6b 100644
--- a/src/adafruit_blinka/microcontroller/mt8167/pin.py
+++ b/src/adafruit_blinka/microcontroller/mt8167/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """MediaTek MT8167 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/nova/__init__.py b/src/adafruit_blinka/microcontroller/nova/__init__.py
index d9b7f757..48463707 100644
--- a/src/adafruit_blinka/microcontroller/nova/__init__.py
+++ b/src/adafruit_blinka/microcontroller/nova/__init__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Generic Connection class for Binho Nova to keep track of connection"""
 
 
diff --git a/src/adafruit_blinka/microcontroller/nova/i2c.py b/src/adafruit_blinka/microcontroller/nova/i2c.py
index e87c9429..4bbde4ae 100644
--- a/src/adafruit_blinka/microcontroller/nova/i2c.py
+++ b/src/adafruit_blinka/microcontroller/nova/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Class for Binho Nova"""
 
 from adafruit_blinka.microcontroller.nova import Connection
diff --git a/src/adafruit_blinka/microcontroller/nova/pin.py b/src/adafruit_blinka/microcontroller/nova/pin.py
index 590ebc62..1fb4c9ab 100644
--- a/src/adafruit_blinka/microcontroller/nova/pin.py
+++ b/src/adafruit_blinka/microcontroller/nova/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Binho Nova pin names"""
 
 
diff --git a/src/adafruit_blinka/microcontroller/nova/pwmout.py b/src/adafruit_blinka/microcontroller/nova/pwmout.py
index 2ff0c259..5c9083d9 100644
--- a/src/adafruit_blinka/microcontroller/nova/pwmout.py
+++ b/src/adafruit_blinka/microcontroller/nova/pwmout.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """PWMOut Class for Binho Nova"""
 
 try:
diff --git a/src/adafruit_blinka/microcontroller/nova/spi.py b/src/adafruit_blinka/microcontroller/nova/spi.py
index e03853df..7f46def0 100644
--- a/src/adafruit_blinka/microcontroller/nova/spi.py
+++ b/src/adafruit_blinka/microcontroller/nova/spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SPI Class for Binho Nova"""
 from adafruit_blinka.microcontroller.nova import Connection
 
diff --git a/src/adafruit_blinka/microcontroller/nova/uart.py b/src/adafruit_blinka/microcontroller/nova/uart.py
index 5d698f8e..ff4dc602 100644
--- a/src/adafruit_blinka/microcontroller/nova/uart.py
+++ b/src/adafruit_blinka/microcontroller/nova/uart.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """UART Class for Binho Nova"""
 
 from adafruit_blinka.microcontroller.nova import Connection
diff --git a/src/adafruit_blinka/microcontroller/nxp_imx6ull/pin.py b/src/adafruit_blinka/microcontroller/nxp_imx6ull/pin.py
index 7ffa3316..020d9afc 100644
--- a/src/adafruit_blinka/microcontroller/nxp_imx6ull/pin.py
+++ b/src/adafruit_blinka/microcontroller/nxp_imx6ull/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """NXP IMX6ULL pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/nxp_imx8m/pin.py b/src/adafruit_blinka/microcontroller/nxp_imx8m/pin.py
index 0d364e47..0202042b 100644
--- a/src/adafruit_blinka/microcontroller/nxp_imx8m/pin.py
+++ b/src/adafruit_blinka/microcontroller/nxp_imx8m/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """NXP IMX8M pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/nxp_lpc4330/analogio.py b/src/adafruit_blinka/microcontroller/nxp_lpc4330/analogio.py
index e45e8d2b..e9ef6e45 100644
--- a/src/adafruit_blinka/microcontroller/nxp_lpc4330/analogio.py
+++ b/src/adafruit_blinka/microcontroller/nxp_lpc4330/analogio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `analogio` - Analog input and output control
 =================================================
diff --git a/src/adafruit_blinka/microcontroller/nxp_lpc4330/i2c.py b/src/adafruit_blinka/microcontroller/nxp_lpc4330/i2c.py
index 4c631114..53e18e89 100644
--- a/src/adafruit_blinka/microcontroller/nxp_lpc4330/i2c.py
+++ b/src/adafruit_blinka/microcontroller/nxp_lpc4330/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Class for NXP LPC4330"""
 from greatfet import GreatFET
 
diff --git a/src/adafruit_blinka/microcontroller/nxp_lpc4330/pin.py b/src/adafruit_blinka/microcontroller/nxp_lpc4330/pin.py
index 24d542dd..187a4d35 100644
--- a/src/adafruit_blinka/microcontroller/nxp_lpc4330/pin.py
+++ b/src/adafruit_blinka/microcontroller/nxp_lpc4330/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """NXP LPC4330 pin names"""
 try:
     from greatfet import GreatFET
diff --git a/src/adafruit_blinka/microcontroller/nxp_lpc4330/pwmout.py b/src/adafruit_blinka/microcontroller/nxp_lpc4330/pwmout.py
index 91c3ede1..cab12589 100644
--- a/src/adafruit_blinka/microcontroller/nxp_lpc4330/pwmout.py
+++ b/src/adafruit_blinka/microcontroller/nxp_lpc4330/pwmout.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """PWMOut Class for NXP LPC4330"""
 
 from greatfet import GreatFET
diff --git a/src/adafruit_blinka/microcontroller/nxp_lpc4330/spi.py b/src/adafruit_blinka/microcontroller/nxp_lpc4330/spi.py
index 28b4fd2a..29f4734c 100644
--- a/src/adafruit_blinka/microcontroller/nxp_lpc4330/spi.py
+++ b/src/adafruit_blinka/microcontroller/nxp_lpc4330/spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SPI Class for NXP LPC4330"""
 from greatfet import GreatFET
 
@@ -69,8 +72,7 @@ def _find_closest_preset(self, target_frequency):
         to the found value
         """
         closest_preset = None
-        for frequency in self._presets:
-            preset = self._presets[frequency]
+        for frequency, preset in self._presets.items():
             if self._frequency is None or abs(frequency - target_frequency) < abs(
                 self._frequency - target_frequency
             ):
diff --git a/src/adafruit_blinka/microcontroller/nxp_lpc4330/uart.py b/src/adafruit_blinka/microcontroller/nxp_lpc4330/uart.py
index 3f077001..f2c1c558 100644
--- a/src/adafruit_blinka/microcontroller/nxp_lpc4330/uart.py
+++ b/src/adafruit_blinka/microcontroller/nxp_lpc4330/uart.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """UART Class for NXP LPC4330"""
 from greatfet import GreatFET
 from greatfet.interfaces.uart import UART as _UART
diff --git a/src/adafruit_blinka/microcontroller/pentium/n3710/.gitignore b/src/adafruit_blinka/microcontroller/pentium/n3710/.gitignore
deleted file mode 100644
index 0e7f5503..00000000
--- a/src/adafruit_blinka/microcontroller/pentium/n3710/.gitignore
+++ /dev/null
@@ -1,1 +0,0 @@
-pins
diff --git a/src/adafruit_blinka/microcontroller/pentium/n3710/pin.py b/src/adafruit_blinka/microcontroller/pentium/n3710/pin.py
index 3093a202..632e75af 100644
--- a/src/adafruit_blinka/microcontroller/pentium/n3710/pin.py
+++ b/src/adafruit_blinka/microcontroller/pentium/n3710/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pentium N3710 (Braswell core SOC) pin names
    i2c and GPIO can be accessed through Blinka.
    For i2c use IC20_SCL, IC20-SDA and IC21-SCL, IC21-SDA in the i2c(<sdl, sda>) calls.
diff --git a/src/adafruit_blinka/microcontroller/rockchip/PWMOut.py b/src/adafruit_blinka/microcontroller/rockchip/PWMOut.py
index 09c4a8e2..56dd2809 100644
--- a/src/adafruit_blinka/microcontroller/rockchip/PWMOut.py
+++ b/src/adafruit_blinka/microcontroller/rockchip/PWMOut.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 Much code from https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py
 Copyright (c) 2015-2016 vsergeev / Ivan (Vanya) A. Sergeev
@@ -91,7 +94,9 @@ def _open(self, pwm, frequency, duty_cycle, variable_frequency):
         if not os.path.isdir(self._channel_path):
             # Exporting the PWM.
             try:
-                with open(os.path.join(self._chip_path, "export"), "w") as f_export:
+                with open(
+                    os.path.join(self._chip_path, "export"), "w", encoding="utf-8"
+                ) as f_export:
                     f_export.write("{:d}\n".format(self._channel))
             except IOError as e:
                 raise PWMError(
@@ -122,6 +127,7 @@ def _open(self, pwm, frequency, duty_cycle, variable_frequency):
                     with open(
                         os.path.join(self._channel_path, "period"),
                         "w",
+                        encoding="utf-8",
                     ):
                         break
                 except IOError as e:
@@ -157,11 +163,15 @@ def close(self):
         self._channel = None
 
     def _write_channel_attr(self, attr, value):
-        with open(os.path.join(self._channel_path, attr), "w") as f_attr:
+        with open(
+            os.path.join(self._channel_path, attr), "w", encoding="utf-8"
+        ) as f_attr:
             f_attr.write(value + "\n")
 
     def _read_channel_attr(self, attr):
-        with open(os.path.join(self._channel_path, attr), "r") as f_attr:
+        with open(
+            os.path.join(self._channel_path, attr), "r", encoding="utf-8"
+        ) as f_attr:
             return f_attr.read().strip()
 
     # Methods
diff --git a/src/adafruit_blinka/microcontroller/rockchip/rk3308/pin.py b/src/adafruit_blinka/microcontroller/rockchip/rk3308/pin.py
index 818c9dd6..24b0c40d 100644
--- a/src/adafruit_blinka/microcontroller/rockchip/rk3308/pin.py
+++ b/src/adafruit_blinka/microcontroller/rockchip/rk3308/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """A Pin class for use with Rockchip RK3308."""
 
 from adafruit_blinka.microcontroller.generic_linux.sysfs_pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/rockchip/rk3328/__init__.py b/src/adafruit_blinka/microcontroller/rockchip/rk3328/__init__.py
index 83fc22c6..83bd2dba 100644
--- a/src/adafruit_blinka/microcontroller/rockchip/rk3328/__init__.py
+++ b/src/adafruit_blinka/microcontroller/rockchip/rk3328/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the Rockchip RK3328 chip"""
diff --git a/src/adafruit_blinka/microcontroller/rockchip/rk3328/pin.py b/src/adafruit_blinka/microcontroller/rockchip/rk3328/pin.py
index b9cc3d7c..e41ac2fa 100644
--- a/src/adafruit_blinka/microcontroller/rockchip/rk3328/pin.py
+++ b/src/adafruit_blinka/microcontroller/rockchip/rk3328/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """A Pin class for use with Rockchip RK3328."""
 
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/rockchip/rk3399/pin.py b/src/adafruit_blinka/microcontroller/rockchip/rk3399/pin.py
index 44198610..9d6de087 100644
--- a/src/adafruit_blinka/microcontroller/rockchip/rk3399/pin.py
+++ b/src/adafruit_blinka/microcontroller/rockchip/rk3399/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """A Pin class for use with Rockchip RK3399."""
 
 from adafruit_blinka.microcontroller.generic_linux.sysfs_pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/rp2040/i2c.py b/src/adafruit_blinka/microcontroller/rp2040/i2c.py
index 4635b3fb..8daf2490 100644
--- a/src/adafruit_blinka/microcontroller/rp2040/i2c.py
+++ b/src/adafruit_blinka/microcontroller/rp2040/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Class for RP2040"""
 from machine import I2C as _I2C
 from machine import Pin
diff --git a/src/adafruit_blinka/microcontroller/rp2040/pin.py b/src/adafruit_blinka/microcontroller/rp2040/pin.py
index bc086c9a..518090d3 100755
--- a/src/adafruit_blinka/microcontroller/rp2040/pin.py
+++ b/src/adafruit_blinka/microcontroller/rp2040/pin.py
@@ -1,6 +1,9 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """RP2040 pins"""
 
-from microcontroller import Pin
+from ..generic_micropython import Pin
 
 GP0 = Pin(0)
 GP1 = Pin(1)
diff --git a/src/adafruit_blinka/microcontroller/rp2040/spi.py b/src/adafruit_blinka/microcontroller/rp2040/spi.py
index f3801a03..4480a883 100644
--- a/src/adafruit_blinka/microcontroller/rp2040/spi.py
+++ b/src/adafruit_blinka/microcontroller/rp2040/spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SPI Class for RP2040"""
 from machine import SPI as _SPI
 from machine import Pin
diff --git a/src/adafruit_blinka/microcontroller/rp2040/uart.py b/src/adafruit_blinka/microcontroller/rp2040/uart.py
index a233b8e3..61c93ce3 100644
--- a/src/adafruit_blinka/microcontroller/rp2040/uart.py
+++ b/src/adafruit_blinka/microcontroller/rp2040/uart.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """UART Class for RP2040"""
 from machine import UART as _UART
 from machine import Pin
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py
index e4db7468..08e36c32 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/analogio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `analogio` - Analog input and output control
 =================================================
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py
index 19d155b8..f4a1a61f 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """I2C Classes for RP2040s with u2if firmware"""
 from .rp2040_u2if import rp2040_u2if
 
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/neopixel.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/neopixel.py
index f0177aea..c87d2c77 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/neopixel.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/neopixel.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """NeoPixel write for Pico u2if."""
 
 from .rp2040_u2if import rp2040_u2if
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/pin.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/pin.py
index 37a5ed50..c42f6238 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/pin.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Generic RP2040 pin names"""
 from .rp2040_u2if import rp2040_u2if
 
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/pwmio.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/pwmio.py
index 3cbf5e47..afcaf543 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/pwmio.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/pwmio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """PWMOut Class for RP2040s with u2if"""
 from .rp2040_u2if import rp2040_u2if
 
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/rp2040_u2if.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/rp2040_u2if.py
index b7acaf0e..8dfda5b7 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/rp2040_u2if.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/rp2040_u2if.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Helper class for use with RP2040 running u2if firmware"""
 # https://github.com/execuc/u2if
 
diff --git a/src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py b/src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
index 4cad9be6..435baba2 100644
--- a/src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
+++ b/src/adafruit_blinka/microcontroller/rp2040_u2if/spi.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SPI Classes for RP2040s with u2if firmware"""
 from .rp2040_u2if import rp2040_u2if
 
diff --git a/src/adafruit_blinka/microcontroller/sama5/pin.py b/src/adafruit_blinka/microcontroller/sama5/pin.py
index f3aa1a7c..1fdee5be 100644
--- a/src/adafruit_blinka/microcontroller/sama5/pin.py
+++ b/src/adafruit_blinka/microcontroller/sama5/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Atmel SAMA5 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/samsung/exynos5422/pin.py b/src/adafruit_blinka/microcontroller/samsung/exynos5422/pin.py
index c06eb31d..8e70ed28 100644
--- a/src/adafruit_blinka/microcontroller/samsung/exynos5422/pin.py
+++ b/src/adafruit_blinka/microcontroller/samsung/exynos5422/pin.py
@@ -1,5 +1,8 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
-Samsum Exynos5422
+Samsung Exynos5422
 Ref:
     Linux kernel 4.14.y (hardkernel)
 """
diff --git a/src/adafruit_blinka/microcontroller/snapdragon/apq8016/pin.py b/src/adafruit_blinka/microcontroller/snapdragon/apq8016/pin.py
index 7b3d1402..f482e5fe 100644
--- a/src/adafruit_blinka/microcontroller/snapdragon/apq8016/pin.py
+++ b/src/adafruit_blinka/microcontroller/snapdragon/apq8016/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """SnapDragon APQ8016 pin names"""
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/starfive/JH71x0/__init__.py b/src/adafruit_blinka/microcontroller/starfive/JH71x0/__init__.py
index 6f9f142f..c848edcf 100644
--- a/src/adafruit_blinka/microcontroller/starfive/JH71x0/__init__.py
+++ b/src/adafruit_blinka/microcontroller/starfive/JH71x0/__init__.py
@@ -1,1 +1,4 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Definition for the StarFive JH71x0 chip"""
diff --git a/src/adafruit_blinka/microcontroller/starfive/JH71x0/pin.py b/src/adafruit_blinka/microcontroller/starfive/JH71x0/pin.py
index af705b67..dbd98a17 100644
--- a/src/adafruit_blinka/microcontroller/starfive/JH71x0/pin.py
+++ b/src/adafruit_blinka/microcontroller/starfive/JH71x0/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """A Pin class for use with StarFive JH71x0."""
 
 from adafruit_blinka.microcontroller.generic_linux.libgpiod_pin import Pin
diff --git a/src/adafruit_blinka/microcontroller/stm32/stm32f405/pin.py b/src/adafruit_blinka/microcontroller/stm32/stm32f405/pin.py
index 605015d4..f967b2b9 100755
--- a/src/adafruit_blinka/microcontroller/stm32/stm32f405/pin.py
+++ b/src/adafruit_blinka/microcontroller/stm32/stm32f405/pin.py
@@ -1,6 +1,9 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """STM32F405 pins"""
 
-from microcontroller import Pin
+from ...generic_micropython import Pin
 
 A0 = Pin("A0")
 A1 = Pin("A1")
diff --git a/src/adafruit_blinka/microcontroller/stm32/stm32mp157/pin.py b/src/adafruit_blinka/microcontroller/stm32/stm32mp157/pin.py
index c7ad7568..bc8cd5d7 100755
--- a/src/adafruit_blinka/microcontroller/stm32/stm32mp157/pin.py
+++ b/src/adafruit_blinka/microcontroller/stm32/stm32mp157/pin.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """STM32MP157 pins"""
 from adafruit_blinka.microcontroller.generic_linux.periphery_pin import Pin
 
diff --git a/src/adafruit_blinka/microcontroller/tegra/t186/pin.py b/src/adafruit_blinka/microcontroller/tegra/t186/pin.py
index 2191c260..91e87fd8 100644
--- a/src/adafruit_blinka/microcontroller/tegra/t186/pin.py
+++ b/src/adafruit_blinka/microcontroller/tegra/t186/pin.py
@@ -1,7 +1,10 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Tegra T186 pin names"""
 
 import atexit
-import Jetson.GPIO as GPIO
+from Jetson import GPIO
 
 GPIO.setmode(GPIO.TEGRA_SOC)
 GPIO.setwarnings(False)  # shh!
diff --git a/src/adafruit_blinka/microcontroller/tegra/t194/pin.py b/src/adafruit_blinka/microcontroller/tegra/t194/pin.py
index 4bcfff99..a63a7996 100644
--- a/src/adafruit_blinka/microcontroller/tegra/t194/pin.py
+++ b/src/adafruit_blinka/microcontroller/tegra/t194/pin.py
@@ -1,6 +1,9 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Tegra T194 pin names"""
 import atexit
-import Jetson.GPIO as GPIO
+from Jetson import GPIO
 
 GPIO.setmode(GPIO.TEGRA_SOC)
 GPIO.setwarnings(False)  # shh!
diff --git a/src/adafruit_blinka/microcontroller/tegra/t210/pin.py b/src/adafruit_blinka/microcontroller/tegra/t210/pin.py
index e8c4c9ef..dafe8100 100644
--- a/src/adafruit_blinka/microcontroller/tegra/t210/pin.py
+++ b/src/adafruit_blinka/microcontroller/tegra/t210/pin.py
@@ -1,7 +1,10 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Tegra T210 pin names"""
 
 import atexit
-import Jetson.GPIO as GPIO
+from Jetson import GPIO
 
 GPIO.setmode(GPIO.TEGRA_SOC)
 GPIO.setwarnings(False)  # shh!
diff --git a/src/analogio.py b/src/analogio.py
index 0016505a..23dfb0d5 100644
--- a/src/analogio.py
+++ b/src/analogio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `analogio` - Analog input and output control
 ============================================
diff --git a/src/bitbangio.py b/src/bitbangio.py
index d13b743a..fd0c8443 100755
--- a/src/bitbangio.py
+++ b/src/bitbangio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `bitbangio` - Bitbanged bus protocols
 ==============================================================
diff --git a/src/board.py b/src/board.py
index 69bd3a7d..b3150ed0 100755
--- a/src/board.py
+++ b/src/board.py
@@ -1,24 +1,6 @@
-# The MIT License (MIT)
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
 #
-# Copyright (c) 2017 cefn for adafruit industries
-#
-# 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.
+# SPDX-License-Identifier: MIT
 """
 `board` - Define ids for available pins
 =================================================
diff --git a/src/busio.py b/src/busio.py
index 1fd15325..0605ee90 100755
--- a/src/busio.py
+++ b/src/busio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `busio` - Bus protocol support like I2C and SPI
 =================================================
diff --git a/src/digitalio.py b/src/digitalio.py
index f00b266f..99f0a081 100755
--- a/src/digitalio.py
+++ b/src/digitalio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `digitalio` - Digital input and output control (GPIO)
 =====================================================
diff --git a/src/keypad.py b/src/keypad.py
index df315414..b379c20f 100644
--- a/src/keypad.py
+++ b/src/keypad.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `keypad` - Support for scanning keys and key matrices
 ===========================================================
diff --git a/src/microcontroller/__init__.py b/src/microcontroller/__init__.py
index 59bf33de..3d71f8a8 100755
--- a/src/microcontroller/__init__.py
+++ b/src/microcontroller/__init__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `microcontroller` - Pin references and cpu functionality
 ========================================================
@@ -9,8 +12,9 @@
 import time
 
 from adafruit_platformdetect.constants import chips as ap_chip
-from adafruit_blinka import Enum
 from adafruit_blinka.agnostic import board_id, chip_id
+from microcontroller import pin  # pylint: disable=unused-import
+from microcontroller.pin import Pin  # pylint: disable=unused-import
 
 
 def delay_us(delay):
@@ -18,35 +22,6 @@ def delay_us(delay):
     time.sleep(delay / 1e6)
 
 
-class Pin(Enum):
-    """
-    Identifies an IO pin on the microcontroller.
-
-    They are fixed by the hardware so they cannot be constructed on demand. Instead, use board or
-    microcontroller.pin to reference the desired pin.
-    """
-
-    def __init__(self, pin_id):
-        """Identifier for pin, referencing platform-specific pin id"""
-        self.id = pin_id
-
-    def __repr__(self):
-        # pylint: disable=import-outside-toplevel, cyclic-import
-        import board
-
-        for key in dir(board):
-            if getattr(board, key) is self:
-                return "board.{}".format(key)
-        import microcontroller.pin as pin
-
-        # pylint: enable=import-outside-toplevel, cyclic-import
-
-        for key in dir(pin):
-            if getattr(pin, key) is self:
-                return "microcontroller.pin.{}".format(key)
-        return repr(self)
-
-
 # We intentionally are patching into this namespace so skip the wildcard check.
 # pylint: disable=unused-wildcard-import,wildcard-import,ungrouped-imports
 
@@ -62,11 +37,11 @@ def __repr__(self):
         "RASPBERRY_PI_400",
         "RASPBERRY_PI_CM4",
     ]:
-        from adafruit_blinka.microcontroller.bcm2711.pin import *
+        from adafruit_blinka.microcontroller.bcm2711 import *
     else:
-        from adafruit_blinka.microcontroller.bcm283x.pin import *
+        from adafruit_blinka.microcontroller.bcm283x import *
 elif chip_id == ap_chip.DRA74X:
-    from adafruit_blinka.microcontroller.dra74x.pin import *
+    from adafruit_blinka.microcontroller.dra74x import *
 elif chip_id == ap_chip.AM33XX:
     from adafruit_blinka.microcontroller.am335x import *
 elif chip_id == ap_chip.JH71x0:
@@ -74,11 +49,11 @@ def __repr__(self):
 elif chip_id == ap_chip.SUN8I:
     from adafruit_blinka.microcontroller.allwinner.h3 import *
 elif chip_id == ap_chip.H5:
-    from adafruit_blinka.microcontroller.allwinner.h5.pin import *
+    from adafruit_blinka.microcontroller.allwinner.h5 import *
 elif chip_id == ap_chip.H6:
-    from adafruit_blinka.microcontroller.allwinner.h6.pin import *
+    from adafruit_blinka.microcontroller.allwinner.h6 import *
 elif chip_id == ap_chip.H616:
-    from adafruit_blinka.microcontroller.allwinner.h616.pin import *
+    from adafruit_blinka.microcontroller.allwinner.h616 import *
 elif chip_id == ap_chip.SAMA5:
     from adafruit_blinka.microcontroller.sama5 import *
 elif chip_id == ap_chip.T210:
@@ -88,57 +63,57 @@ def __repr__(self):
 elif chip_id == ap_chip.T194:
     from adafruit_blinka.microcontroller.tegra.t194 import *
 elif chip_id == ap_chip.S905:
-    from adafruit_blinka.microcontroller.amlogic.s905.pin import *
+    from adafruit_blinka.microcontroller.amlogic.s905 import *
 elif chip_id == ap_chip.S905X3:
-    from adafruit_blinka.microcontroller.amlogic.s905x3.pin import *
+    from adafruit_blinka.microcontroller.amlogic.s905x3 import *
 elif chip_id == ap_chip.S922X:
-    from adafruit_blinka.microcontroller.amlogic.s922x.pin import *
+    from adafruit_blinka.microcontroller.amlogic.s922x import *
 elif chip_id == ap_chip.EXYNOS5422:
-    from adafruit_blinka.microcontroller.samsung.exynos5422.pin import *
+    from adafruit_blinka.microcontroller.samsung.exynos5422 import *
 elif chip_id == ap_chip.APQ8016:
-    from adafruit_blinka.microcontroller.snapdragon.apq8016.pin import *
+    from adafruit_blinka.microcontroller.snapdragon.apq8016 import *
 elif chip_id == ap_chip.A64:
-    from adafruit_blinka.microcontroller.allwinner.a64.pin import *
+    from adafruit_blinka.microcontroller.allwinner.a64 import *
 elif chip_id == ap_chip.A33:
-    from adafruit_blinka.microcontroller.allwinner.a33.pin import *
+    from adafruit_blinka.microcontroller.allwinner.a33 import *
 elif chip_id == ap_chip.RK3308:
-    from adafruit_blinka.microcontroller.rockchip.rk3308.pin import *
+    from adafruit_blinka.microcontroller.rockchip.rk3308 import *
 elif chip_id == ap_chip.RK3399:
-    from adafruit_blinka.microcontroller.rockchip.rk3399.pin import *
+    from adafruit_blinka.microcontroller.rockchip.rk3399 import *
 elif chip_id == ap_chip.RK3328:
-    from adafruit_blinka.microcontroller.rockchip.rk3328.pin import *
+    from adafruit_blinka.microcontroller.rockchip.rk3328 import *
 elif chip_id == ap_chip.H3:
-    from adafruit_blinka.microcontroller.allwinner.h3.pin import *
+    from adafruit_blinka.microcontroller.allwinner.h3 import *
 elif chip_id == ap_chip.H5:
-    from adafruit_blinka.microcontroller.allwinner.h5.pin import *
+    from adafruit_blinka.microcontroller.allwinner.h5 import *
 elif chip_id == ap_chip.IMX8MX:
     from adafruit_blinka.microcontroller.nxp_imx8m import *
 elif chip_id == ap_chip.IMX6ULL:
     from adafruit_blinka.microcontroller.nxp_imx6ull import *
 elif chip_id == ap_chip.HFU540:
-    from adafruit_blinka.microcontroller.hfu540.pin import *
+    from adafruit_blinka.microcontroller.hfu540 import *
 elif chip_id == ap_chip.BINHO:
     from adafruit_blinka.microcontroller.nova import *
 elif chip_id == ap_chip.LPC4330:
     from adafruit_blinka.microcontroller.nxp_lpc4330 import *
 elif chip_id == ap_chip.MCP2221:
-    from adafruit_blinka.microcontroller.mcp2221.pin import *
+    from adafruit_blinka.microcontroller.mcp2221 import *
 elif chip_id == ap_chip.MIPS24KC:
     from adafruit_blinka.microcontroller.atheros.ar9331 import *
 elif chip_id == ap_chip.MIPS24KEC:
     from adafruit_blinka.microcontroller.mips24kec import *
 elif chip_id == ap_chip.FT232H:
-    from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h.pin import *
+    from adafruit_blinka.microcontroller.ftdi_mpsse.ft232h import *
 elif chip_id == ap_chip.FT2232H:
-    from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h.pin import *
+    from adafruit_blinka.microcontroller.ftdi_mpsse.ft2232h import *
 elif chip_id == ap_chip.PENTIUM_N3710:
-    from adafruit_blinka.microcontroller.pentium.n3710.pin import *
+    from adafruit_blinka.microcontroller.pentium.n3710 import *
 elif chip_id == ap_chip.STM32MP157:
-    from adafruit_blinka.microcontroller.stm32.stm32mp157.pin import *
+    from adafruit_blinka.microcontroller.stm32.stm32mp157 import *
 elif chip_id == ap_chip.MT8167:
-    from adafruit_blinka.microcontroller.mt8167.pin import *
+    from adafruit_blinka.microcontroller.mt8167 import *
 elif chip_id == ap_chip.RP2040_U2IF:
-    from adafruit_blinka.microcontroller.rp2040_u2if.pin import *
+    from adafruit_blinka.microcontroller.rp2040_u2if import *
 elif chip_id == ap_chip.GENERIC_X86:
     print("WARNING: GENERIC_X86 is not fully supported. Some features may not work.")
 elif "sphinx" in sys.modules:
diff --git a/src/microcontroller/pin.py b/src/microcontroller/pin.py
index cfacf5ff..dd912fb1 100755
--- a/src/microcontroller/pin.py
+++ b/src/microcontroller/pin.py
@@ -1,5 +1,9 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Pins named after their chip name."""
 
+import sys
 from adafruit_platformdetect.constants import chips as ap_chip
 from adafruit_blinka.agnostic import board_id, chip_id
 
@@ -93,5 +97,8 @@
     from adafruit_blinka.microcontroller.mt8167.pin import *
 elif chip_id == ap_chip.RP2040_U2IF:
     from adafruit_blinka.microcontroller.rp2040_u2if.pin import *
+elif "sphinx" in sys.modules:
+    # pylint: disable=unused-import
+    from adafruit_blinka.microcontroller.generic_micropython import Pin
 else:
     raise NotImplementedError("Microcontroller not supported: ", chip_id)
diff --git a/src/micropython.py b/src/micropython.py
index 843d5a57..4f88543d 100755
--- a/src/micropython.py
+++ b/src/micropython.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `micropython` - MicroPython Specific Decorator Functions
 ========================================================
diff --git a/src/neopixel_write.py b/src/neopixel_write.py
index 38feca55..2bc5f817 100644
--- a/src/neopixel_write.py
+++ b/src/neopixel_write.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `neopixel_write` - NeoPixel precision timed writing support
 ===========================================================
diff --git a/src/pulseio.py b/src/pulseio.py
index b8c209bb..f80459e6 100644
--- a/src/pulseio.py
+++ b/src/pulseio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `pulseio` - Pulse Width Modulation input and output control
 ===========================================================
diff --git a/src/pwmio.py b/src/pwmio.py
index d5164bfb..f4d6a8c9 100644
--- a/src/pwmio.py
+++ b/src/pwmio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `pwmio` - Support for PWM based protocols
 ===========================================================
diff --git a/src/rainbowio.py b/src/rainbowio.py
index a411e3d1..5ed5a3a2 100644
--- a/src/rainbowio.py
+++ b/src/rainbowio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `rainbowio` - Provides the `colorwheel()` function
 ===========================================================
diff --git a/src/usb_hid.py b/src/usb_hid.py
index 7db2b8e3..8286b558 100644
--- a/src/usb_hid.py
+++ b/src/usb_hid.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """
 `usb_hid` - support for usb hid devices via usb_gadget driver
 ===========================================================
@@ -15,7 +18,7 @@
 import sys
 
 for module in ["dwc2", "libcomposite"]:
-    if Path("/proc/modules").read_text().find(module) == -1:
+    if Path("/proc/modules").read_text(encoding="utf-8").find(module) == -1:
         raise Exception(
             "%s module not present in your kernel. did you insmod it?" % module
         )
@@ -57,7 +60,7 @@ def send_report(self, report: bytearray, report_id: int = None):
         """
         report_id = report_id or self.report_ids[0]
         device_path = self.get_device_path(report_id)
-        with open(device_path, "rb+") as fd:
+        with open(device_path, "rb+", encoding="utf-8") as fd:
             if report_id > 0:
                 report = bytearray(report_id.to_bytes(1, "big")) + report
             fd.write(report)
@@ -79,7 +82,7 @@ def get_last_received_report(self, report_id=None) -> bytes:
         Return `None` if nothing received.
         """
         device_path = self.get_device_path(report_id or self.report_ids[0])
-        with open(device_path, "rb+") as fd:
+        with open(device_path, "rb+", encoding="utf-8") as fd:
             os.set_blocking(fd.fileno(), False)
             report = fd.read(self.out_report_lengths[0])
             if report is not None:
@@ -95,7 +98,7 @@ def get_device_path(self, report_id):
                 "%s/functions/hid.usb%s/dev"
                 % (this.gadget_root, report_id or self.report_ids[0])
             )
-            .read_text()
+            .read_text(encoding="utf-8")
             .strip()
             .split(":")[1]
         )
@@ -462,7 +465,7 @@ def disable() -> None:
     as `usb_cdc` or `storage` to free up endpoints for use by `usb_hid`.
     """
     try:
-        Path("%s/UDC" % this.gadget_root).write_text("")
+        Path("%s/UDC" % this.gadget_root).write_text("", encoding="utf-8")
     except FileNotFoundError:
         pass
     for symlink in Path(this.gadget_root).glob("configs/**/hid.usb*"):
@@ -582,18 +585,30 @@ def enable(requested_devices: Sequence[Device], boot_device: int = 0) -> None:
     # """
     Path("%s/functions" % this.gadget_root).mkdir(parents=True, exist_ok=True)
     Path("%s/configs" % this.gadget_root).mkdir(parents=True, exist_ok=True)
-    Path("%s/bcdDevice" % this.gadget_root).write_text("%s" % 1)  # Version 1.0.0
-    Path("%s/bcdUSB" % this.gadget_root).write_text("%s" % 0x0200)  # USB 2.0
+    Path("%s/bcdDevice" % this.gadget_root).write_text(
+        "%s" % 1, encoding="utf-8"
+    )  # Version 1.0.0
+    Path("%s/bcdUSB" % this.gadget_root).write_text(
+        "%s" % 0x0200, encoding="utf-8"
+    )  # USB 2.0
     Path("%s/bDeviceClass" % this.gadget_root).write_text(
-        "%s" % 0x00
+        "%s" % 0x00, encoding="utf-8"
     )  # multipurpose i guess?
-    Path("%s/bDeviceProtocol" % this.gadget_root).write_text("%s" % 0x00)
-    Path("%s/bDeviceSubClass" % this.gadget_root).write_text("%s" % 0x00)
-    Path("%s/bMaxPacketSize0" % this.gadget_root).write_text("%s" % 0x08)
+    Path("%s/bDeviceProtocol" % this.gadget_root).write_text(
+        "%s" % 0x00, encoding="utf-8"
+    )
+    Path("%s/bDeviceSubClass" % this.gadget_root).write_text(
+        "%s" % 0x00, encoding="utf-8"
+    )
+    Path("%s/bMaxPacketSize0" % this.gadget_root).write_text(
+        "%s" % 0x08, encoding="utf-8"
+    )
     Path("%s/idProduct" % this.gadget_root).write_text(
-        "%s" % 0x0104
+        "%s" % 0x0104, encoding="utf-8"
     )  # Multifunction Composite Gadget
-    Path("%s/idVendor" % this.gadget_root).write_text("%s" % 0x1D6B)  # Linux Foundation
+    Path("%s/idVendor" % this.gadget_root).write_text(
+        "%s" % 0x1D6B, encoding="utf-8"
+    )  # Linux Foundation
     # """
     # 2. Creating the configurations
     # ------------------------------
@@ -631,10 +646,10 @@ def enable(requested_devices: Sequence[Device], boot_device: int = 0) -> None:
         Path("%s/" % config_root).mkdir(parents=True, exist_ok=True)
         Path("%s/strings/0x409" % config_root).mkdir(parents=True, exist_ok=True)
         Path("%s/strings/0x409/configuration" % config_root).write_text(
-            "my configuration"
+            "my configuration", encoding="utf-8"
         )
-        Path("%s/MaxPower" % config_root).write_text("150")
-        Path("%s/bmAttributes" % config_root).write_text("%s" % 0x080)
+        Path("%s/MaxPower" % config_root).write_text("150", encoding="utf-8")
+        Path("%s/bmAttributes" % config_root).write_text("%s" % 0x080, encoding="utf-8")
         this.devices.append(device)
         # """
         # 3. Creating the functions
@@ -664,11 +679,13 @@ def enable(requested_devices: Sequence[Device], boot_device: int = 0) -> None:
                 Path("%s/" % function_root).mkdir(parents=True)
             except FileExistsError:
                 continue
-            Path("%s/protocol" % function_root).write_text("%s" % report_id)
+            Path("%s/protocol" % function_root).write_text(
+                "%s" % report_id, encoding="utf-8"
+            )
             Path("%s/report_length" % function_root).write_text(
-                "%s" % device.in_report_lengths[report_index]
+                "%s" % device.in_report_lengths[report_index], encoding="utf-8"
             )
-            Path("%s/subclass" % function_root).write_text("%s" % 1)
+            Path("%s/subclass" % function_root).write_text("%s" % 1, encoding="utf-8")
             Path("%s/report_desc" % function_root).write_bytes(device.descriptor)
             # """
             # 4. Associating the functions with their configurations
@@ -700,4 +717,4 @@ def enable(requested_devices: Sequence[Device], boot_device: int = 0) -> None:
     #
     # $ echo s3c-hsotg > UDC  """
     udc = next(Path("/sys/class/udc/").glob("*"))
-    Path("%s/UDC" % this.gadget_root).write_text("%s" % udc.name)
+    Path("%s/UDC" % this.gadget_root).write_text("%s" % udc.name, encoding="utf-8")


Test patch:
diff --git a/test/scripts/upload_feather_huzzah_circuitpython_put.sh b/test/scripts/upload_feather_huzzah_circuitpython_put.sh
index 146dfb96..3f6f74c9 100755
--- a/test/scripts/upload_feather_huzzah_circuitpython_put.sh
+++ b/test/scripts/upload_feather_huzzah_circuitpython_put.sh
@@ -1,4 +1,7 @@
 #!/bin/sh
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 PORT=/dev/ttyUSB0
 
 export MPYCROSS=`realpath ../../../circuitpython_2.2.3/mpy-cross/mpy-cross`
diff --git a/test/scripts/upload_feather_huzzah_micropython_put.sh b/test/scripts/upload_feather_huzzah_micropython_put.sh
index 74a5d8a6..8bfb8ccb 100755
--- a/test/scripts/upload_feather_huzzah_micropython_put.sh
+++ b/test/scripts/upload_feather_huzzah_micropython_put.sh
@@ -1,4 +1,7 @@
 #!/bin/sh
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 PORT=/dev/ttyUSB0
 
 export MPYCROSS=`realpath ../../../micropython/mpy-cross/mpy-cross`
diff --git a/test/scripts/upload_pyboard_micropython_cp.sh b/test/scripts/upload_pyboard_micropython_cp.sh
index a565e6a0..aff08249 100755
--- a/test/scripts/upload_pyboard_micropython_cp.sh
+++ b/test/scripts/upload_pyboard_micropython_cp.sh
@@ -1,4 +1,7 @@
 #!/bin/sh
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 
 export PORT="/dev/ttyUSB0"
 export MPYCROSS=`realpath ../../../micropython/mpy-cross/mpy-cross`
diff --git a/test/src/testing/__init__.py b/test/src/testing/__init__.py
index e3173d1b..fc941bbb 100644
--- a/test/src/testing/__init__.py
+++ b/test/src/testing/__init__.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
 # mitigate heap fragmentation issues by pre-loading major libraries
 import gc
 
diff --git a/test/src/testing/adafruit_blinka.py b/test/src/testing/adafruit_blinka.py
index 3fcecc34..13f3873b 100644
--- a/test/src/testing/adafruit_blinka.py
+++ b/test/src/testing/adafruit_blinka.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import unittest
 
 
diff --git a/test/src/testing/board/__init__.py b/test/src/testing/board/__init__.py
index 73852cec..10dc6a86 100644
--- a/test/src/testing/board/__init__.py
+++ b/test/src/testing/board/__init__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Configuration of testing fixtures depending on the board layout"""
 from adafruit_blinka import agnostic
 
diff --git a/test/src/testing/board/i2c.py b/test/src/testing/board/i2c.py
index 8d824701..e9d9702c 100644
--- a/test/src/testing/board/i2c.py
+++ b/test/src/testing/board/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 from adafruit_blinka import agnostic
 
 if agnostic.board in ("feather_m0_express", "feather_huzzah"):
diff --git a/test/src/testing/microcontroller/__init__.py b/test/src/testing/microcontroller/__init__.py
index deb21aa7..e74132ee 100644
--- a/test/src/testing/microcontroller/__init__.py
+++ b/test/src/testing/microcontroller/__init__.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 from adafruit_blinka.agnostic import microcontroller
 
 if microcontroller == "esp8266":
diff --git a/test/src/testing/universal/digitalio.py b/test/src/testing/universal/digitalio.py
index c6062fc7..36eff5b7 100644
--- a/test/src/testing/universal/digitalio.py
+++ b/test/src/testing/universal/digitalio.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import unittest
 from testing import yes_no, await_true
 from testing.board import led_pin, default_pin, led_hardwired, led_inverted
diff --git a/test/src/testing/universal/i2c.py b/test/src/testing/universal/i2c.py
index ba740449..5c2331a6 100644
--- a/test/src/testing/universal/i2c.py
+++ b/test/src/testing/universal/i2c.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import gc
 from testing import yes_no
 
@@ -66,7 +69,7 @@ def test_read_value(self):
         sensor = adafruit_mma8451.MMA8451(i2c)
 
         x, y, z = sensor.acceleration
-        absolute = math.sqrt(x**2 + y**2 + z**2)
+        absolute = math.sqrt(x ** 2 + y ** 2 + z ** 2)
         self.assertTrue(9 <= absolute <= 11, "Not earth gravity")
 
         orientation = sensor.orientation
diff --git a/test/src/testing/universal/microcontroller.py b/test/src/testing/universal/microcontroller.py
index be9394dc..780f9894 100644
--- a/test/src/testing/universal/microcontroller.py
+++ b/test/src/testing/universal/microcontroller.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import unittest
 
 
diff --git a/test/src/testing/universal/uart.py b/test/src/testing/universal/uart.py
index acd9840e..74a9b459 100644
--- a/test/src/testing/universal/uart.py
+++ b/test/src/testing/universal/uart.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 import gc
 from unittest import TestCase
 from testing import await_true
diff --git a/test/src/unittest.py b/test/src/unittest.py
index 45f92ec3..278101fd 100644
--- a/test/src/unittest.py
+++ b/test/src/unittest.py
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
 """Based on https://raw.githubusercontent.com/micropython/micropython-lib/cfa1b9cce0c93a3115bbff3886c9bbcddd9e8047/unittest/unittest.py """
 import sys