aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/frozen/Adafruit_CircuitPython_BusDevice
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2022-06-19 19:47:51 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2022-06-19 19:47:51 +0530
commit4fd287655a72b9aea14cdac715ad5b90ed082ed2 (patch)
tree65d393bc0e699dd12d05b29ba568e04cea666207 /circuitpython/frozen/Adafruit_CircuitPython_BusDevice
parent0150f70ce9c39e9e6dd878766c0620c85e47bed0 (diff)
add circuitpython code
Diffstat (limited to 'circuitpython/frozen/Adafruit_CircuitPython_BusDevice')
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pre-commit-config.yaml42
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pylintrc436
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.readthedocs.yaml19
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/CODE_OF_CONDUCT.md135
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSE21
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/CC-BY-4.0.txt324
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/MIT.txt19
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/Unlicense.txt20
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst73
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/__init__.py0
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/i2c_device.py186
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/spi_device.py117
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.icobin0 -> 4414 bytes
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst8
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/conf.py182
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst12
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst45
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/requirements.txt5
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_i2c_simpletest.py20
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_spi_simpletest.py22
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_BusDevice/requirements.txt6
-rwxr-xr-xcircuitpython/frozen/Adafruit_CircuitPython_BusDevice/setup.py55
27 files changed, 1762 insertions, 0 deletions
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pre-commit-config.yaml b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pre-commit-config.yaml
new file mode 100644
index 0000000..1b9fadc
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pre-commit-config.yaml
@@ -0,0 +1,42 @@
+# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
+#
+# 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]
+ args:
+ - --disable=consider-using-f-string
+ exclude: "^(docs/|examples/|tests/|setup.py$)"
+ - 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/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pylintrc b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pylintrc
new file mode 100644
index 0000000..3908316
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.pylintrc
@@ -0,0 +1,436 @@
+# 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
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code
+extension-pkg-whitelist=
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=CVS
+
+# Add files or directories matching the regex patterns to the blacklist. The
+# regex matches against base names, not paths.
+ignore-patterns=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Use multiple processes to speed up Pylint.
+jobs=1
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Specify a configuration file.
+#rcfile=
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call
+disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation,unspecified-encoding,duplicate-code
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+enable=
+
+
+[REPORTS]
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details
+#msg-template=
+
+# Set the output format. Available formats are text, parseable, colorized, json
+# and msvs (visual studio).You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+output-format=text
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+# Activate the evaluation score.
+score=yes
+
+
+[REFACTORING]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging
+
+
+[SPELLING]
+
+# Spelling dictionary name. Available dictionaries: none. To make it working
+# install python-enchant package.
+spelling-dict=
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to indicated private dictionary in
+# --spelling-private-dict-file option instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+# notes=FIXME,XXX,TODO
+notes=FIXME,XXX
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# This flag controls whether pylint should warn about no-member and similar
+# checks whenever an opaque object is returned when inferring. The inference
+# can return multiple potential results while evaluating a Python object, but
+# some branches might not be evaluated, which results in partial inference. In
+# that case, it might be useful to still emit no-member and other checks for
+# the rest of the inferred objects.
+ignore-on-opaque-inference=yes
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=board
+
+# Show a hint with possible names when a member name was not found. The aspect
+# of finding the hint is based on edit distance.
+missing-member-hint=yes
+
+# The minimum edit distance a name should have in order to be considered a
+# similar match for a missing member name.
+missing-member-hint-distance=1
+
+# The total number of similar names that should be taken in consideration when
+# showing a hint for a missing member.
+missing-member-max-choices=1
+
+
+[VARIABLES]
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+# Tells whether unused global variables should be treated as a violation.
+allow-global-unused-variables=yes
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,_cb
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*|^ignored_|^unused_
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,future.builtins
+
+
+[FORMAT]
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+# expected-line-ending-format=
+expected-line-ending-format=LF
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Number of spaces of indent required inside a hanging or continued line.
+indent-after-paren=4
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# List of optional constructs for which whitespace checking is disabled. `dict-
+# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
+# `trailing-comma` allows a space between comma and closing bracket: (a, ).
+# `empty-line` allows space-only lines.
+no-space-check=trailing-comma,dict-separator
+
+# Allow the body of a class to be on the same line as the declaration if body
+# contains single statement.
+single-line-class-stmt=no
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+
+[SIMILARITIES]
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=yes
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+
+[BASIC]
+
+# Naming hint for argument names
+argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct argument names
+argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Naming hint for attribute names
+attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct attribute names
+attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Naming hint for class attribute names
+class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Regular expression matching correct class attribute names
+class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Naming hint for class names
+# class-name-hint=[A-Z_][a-zA-Z0-9]+$
+class-name-hint=[A-Z_][a-zA-Z0-9_]+$
+
+# Regular expression matching correct class names
+# class-rgx=[A-Z_][a-zA-Z0-9]+$
+class-rgx=[A-Z_][a-zA-Z0-9_]+$
+
+# Naming hint for constant names
+const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Regular expression matching correct constant names
+const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+# Naming hint for function names
+function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct function names
+function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Good variable names which should always be accepted, separated by a comma
+# good-names=i,j,k,ex,Run,_
+good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_
+
+# Include a hint for the correct naming format with invalid-name
+include-naming-hint=no
+
+# Naming hint for inline iteration names
+inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
+
+# Regular expression matching correct inline iteration names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Naming hint for method names
+method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct method names
+method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Naming hint for module names
+module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression matching correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+property-classes=abc.abstractproperty
+
+# Naming hint for variable names
+variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct variable names
+variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+
+[IMPORTS]
+
+# Allow wildcard imports from modules that define __all__.
+allow-wildcard-with-all=no
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=optparse,tkinter.tix
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,_fields,_replace,_source,_make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of attributes for a class (see R0902).
+# max-attributes=7
+max-attributes=11
+
+# Maximum number of boolean expressions in a if statement
+max-bool-expr=5
+
+# Maximum number of branch for function / method body
+max-branches=12
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=1
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.readthedocs.yaml b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.readthedocs.yaml
new file mode 100644
index 0000000..33c2a61
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/.readthedocs.yaml
@@ -0,0 +1,19 @@
+# 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
+
+build:
+ os: ubuntu-20.04
+ tools:
+ python: "3"
+
+python:
+ install:
+ - requirements: docs/requirements.txt
+ - requirements: requirements.txt
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/CODE_OF_CONDUCT.md b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..8a55c07
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/CODE_OF_CONDUCT.md
@@ -0,0 +1,135 @@
+<!--
+SPDX-FileCopyrightText: 2014 Coraline Ada Ehmke
+SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
+# Adafruit Community Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and leaders pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level or type of
+experience, education, socio-economic status, nationality, personal appearance,
+race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+We are committed to providing a friendly, safe and welcoming environment for
+all.
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Be kind and courteous to others
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Collaborating with other community members
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and sexual attention or advances
+* The use of inappropriate images, including in a community member's avatar
+* The use of inappropriate language, including in a community member's nickname
+* Any spamming, flaming, baiting or other attention-stealing behavior
+* Excessive or unwelcome helping; answering outside the scope of the question
+ asked
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Promoting or spreading disinformation, lies, or conspiracy theories against
+ a person, group, organisation, project, or community
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate
+
+The goal of the standards and moderation guidelines outlined here is to build
+and maintain a respectful community. We ask that you don’t just aim to be
+"technically unimpeachable", but rather try to be your best self.
+
+We value many things beyond technical expertise, including collaboration and
+supporting others within our community. Providing a positive experience for
+other community members can have a much more significant impact than simply
+providing the correct answer.
+
+## Our Responsibilities
+
+Project leaders are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project leaders have the right and responsibility to remove, edit, or
+reject messages, comments, commits, code, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any community member for other behaviors that they deem
+inappropriate, threatening, offensive, or harmful.
+
+## Moderation
+
+Instances of behaviors that violate the Adafruit Community Code of Conduct
+may be reported by any member of the community. Community members are
+encouraged to report these situations, including situations they witness
+involving other community members.
+
+You may report in the following ways:
+
+In any situation, you may send an email to <support@adafruit.com>.
+
+On the Adafruit Discord, you may send an open message from any channel
+to all Community Moderators by tagging @community moderators. You may
+also send an open message from any channel, or a direct message to
+@kattni#1507, @tannewt#4653, @Dan Halbert#1614, @cater#2442,
+@sommersoft#0222, @Mr. Certainly#0472 or @Andon#8175.
+
+Email and direct message reports will be kept confidential.
+
+In situations on Discord where the issue is particularly egregious, possibly
+illegal, requires immediate action, or violates the Discord terms of service,
+you should also report the message directly to Discord.
+
+These are the steps for upholding our community’s standards of conduct.
+
+1. Any member of the community may report any situation that violates the
+Adafruit Community Code of Conduct. All reports will be reviewed and
+investigated.
+2. If the behavior is an egregious violation, the community member who
+committed the violation may be banned immediately, without warning.
+3. Otherwise, moderators will first respond to such behavior with a warning.
+4. Moderators follow a soft "three strikes" policy - the community member may
+be given another chance, if they are receptive to the warning and change their
+behavior.
+5. If the community member is unreceptive or unreasonable when warned by a
+moderator, or the warning goes unheeded, they may be banned for a first or
+second offense. Repeated offenses will result in the community member being
+banned.
+
+## Scope
+
+This Code of Conduct and the enforcement policies listed above apply to all
+Adafruit Community venues. This includes but is not limited to any community
+spaces (both public and private), the entire Adafruit Discord server, and
+Adafruit GitHub repositories. Examples of Adafruit Community spaces include
+but are not limited to meet-ups, audio chats on the Adafruit Discord, or
+interaction at a conference.
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. As a community
+member, you are representing our community, and are expected to behave
+accordingly.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 1.4, available at
+<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>,
+and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html).
+
+For other projects adopting the Adafruit Community Code of
+Conduct, please contact the maintainers of those projects for enforcement.
+If you wish to use this code of conduct for your own project, consider
+explicitly mentioning your moderation policy or making a copy with your
+own moderation policy so as to avoid confusion.
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSE b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSE
new file mode 100644
index 0000000..19a9cd8
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 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.
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/CC-BY-4.0.txt b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/CC-BY-4.0.txt
new file mode 100644
index 0000000..3f92dfc
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/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/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/MIT.txt b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/MIT.txt
new file mode 100644
index 0000000..204b93d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/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/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/Unlicense.txt b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/LICENSES/Unlicense.txt
new file mode 100644
index 0000000..24a8f90
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/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/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst
new file mode 100644
index 0000000..8f5f40f
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst
@@ -0,0 +1,73 @@
+Adafruit CircuitPython BusDevice
+================================
+
+.. image:: https://readthedocs.org/projects/adafruit-circuitpython-busdevice/badge/?version=latest
+ :target: https://docs.circuitpython.org/projects/busdevice/en/latest/
+ :alt: Documentation Status
+
+.. image :: https://img.shields.io/discord/327254708534116352.svg
+ :target: https://adafru.it/discord
+ :alt: Discord
+
+.. image:: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice/workflows/Build%20CI/badge.svg
+ :target: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice/actions/
+ :alt: Build Status
+
+The ``I2CDevice`` and ``SPIDevice`` helper classes make managing transaction state
+on a bus easy. For example, they manage locking the bus to prevent other
+concurrent access. For SPI devices, it manages the chip select and protocol
+changes such as mode. For I2C, it manages the device address.
+
+.. _bus_device_installation:
+
+.. note:: On microcontroller boards using CircuitPython v6.3.0 or newer, the firmware
+ may already have the ``adafruit_bus_device`` package builtin, thus there may be no
+ need to add this package to your CIRCUITPY drive's "lib" directory. If both the
+ builtin and add-on ``adafruit_bus_device`` packages are present, then some
+ libraries that require this package *might* have problems importing it.
+
+ Please check the `CircuitPython documentation's "module support matrix"
+ <https://docs.circuitpython.org/en/latest/shared-bindings/support_matrix.html>`_
+ to make sure that your board's firmware does include the builtin ``adafruit_bus_device``
+ package.
+
+On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from
+PyPI <https://pypi.org/project/adafruit-circuitpython-busdevice/>`_. To install for current user:
+
+.. code-block:: shell
+
+ pip3 install adafruit-circuitpython-busdevice
+
+To install system-wide (this may be required in some cases):
+
+.. code-block:: shell
+
+ sudo pip3 install adafruit-circuitpython-busdevice
+
+To install in a virtual environment in your current project:
+
+.. code-block:: shell
+
+ mkdir project-name && cd project-name
+ python3 -m venv .env
+ source .env/bin/activate
+ pip3 install adafruit-circuitpython-busdevice
+
+Usage Example
+=============
+
+See examples/read_register_i2c.py and examples/read_register_spi.py for examples of the module's usage.
+
+Documentation
+=============
+
+API documentation for this library can be found on `Read the Docs <https://docs.circuitpython.org/projects/busdevice/en/latest/>`_.
+
+For information on building library documentation, please check out `this guide <https://learn.adafruit.com/creating-and-sharing-a-circuitpython-library/sharing-our-docs-on-readthedocs#sphinx-5-1>`_.
+
+Contributing
+============
+
+Contributions are welcome! Please read our `Code of Conduct
+<https://github.com/adafruit/Adafruit_CircuitPython_BusDevice/blob/main/CODE_OF_CONDUCT.md>`_
+before contributing to help this project stay welcoming.
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst.license
new file mode 100644
index 0000000..11cd75d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/README.rst.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
+
+SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/__init__.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/__init__.py
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/i2c_device.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/i2c_device.py
new file mode 100644
index 0000000..5e18849
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/i2c_device.py
@@ -0,0 +1,186 @@
+# SPDX-FileCopyrightText: 2016 Scott Shawcroft for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+"""
+`adafruit_bus_device.i2c_device` - I2C Bus Device
+====================================================
+"""
+
+try:
+ from typing import Optional, Type
+ from types import TracebackType
+ from circuitpython_typing import ReadableBuffer, WriteableBuffer
+
+ # Used only for type annotations.
+ from busio import I2C
+except ImportError:
+ pass
+
+
+__version__ = "0.0.0-auto.0"
+__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git"
+
+
+class I2CDevice:
+ """
+ Represents a single I2C device and manages locking the bus and the device
+ address.
+
+ :param ~busio.I2C i2c: The I2C bus the device is on
+ :param int device_address: The 7 bit device address
+ :param bool probe: Probe for the device upon object creation, default is true
+
+ .. note:: This class is **NOT** built into CircuitPython. See
+ :ref:`here for install instructions <bus_device_installation>`.
+
+ Example:
+
+ .. code-block:: python
+
+ import busio
+ from board import *
+ from adafruit_bus_device.i2c_device import I2CDevice
+
+ with busio.I2C(SCL, SDA) as i2c:
+ device = I2CDevice(i2c, 0x70)
+ bytes_read = bytearray(4)
+ with device:
+ device.readinto(bytes_read)
+ # A second transaction
+ with device:
+ device.write(bytes_read)
+ """
+
+ def __init__(self, i2c: I2C, device_address: int, probe: bool = True) -> None:
+
+ self.i2c = i2c
+ self.device_address = device_address
+
+ if probe:
+ self.__probe_for_device()
+
+ def readinto(
+ self, buf: WriteableBuffer, *, start: int = 0, end: Optional[int] = None
+ ) -> None:
+ """
+ Read into ``buf`` from the device. The number of bytes read will be the
+ length of ``buf``.
+
+ If ``start`` or ``end`` is provided, then the buffer will be sliced
+ as if ``buf[start:end]``. This will not cause an allocation like
+ ``buf[start:end]`` will so it saves memory.
+
+ :param ~WriteableBuffer buffer: buffer to write into
+ :param int start: Index to start writing at
+ :param int end: Index to write up to but not include; if None, use ``len(buf)``
+ """
+ if end is None:
+ end = len(buf)
+ self.i2c.readfrom_into(self.device_address, buf, start=start, end=end)
+
+ def write(
+ self, buf: ReadableBuffer, *, start: int = 0, end: Optional[int] = None
+ ) -> None:
+ """
+ Write the bytes from ``buffer`` to the device, then transmit a stop
+ bit.
+
+ If ``start`` or ``end`` is provided, then the buffer will be sliced
+ as if ``buffer[start:end]``. This will not cause an allocation like
+ ``buffer[start:end]`` will so it saves memory.
+
+ :param ~ReadableBuffer buffer: buffer containing the bytes to write
+ :param int start: Index to start writing from
+ :param int end: Index to read up to but not include; if None, use ``len(buf)``
+ """
+ if end is None:
+ end = len(buf)
+ self.i2c.writeto(self.device_address, buf, start=start, end=end)
+
+ # pylint: disable-msg=too-many-arguments
+ def write_then_readinto(
+ self,
+ out_buffer: ReadableBuffer,
+ in_buffer: WriteableBuffer,
+ *,
+ out_start: int = 0,
+ out_end: Optional[int] = None,
+ in_start: int = 0,
+ in_end: Optional[int] = None
+ ) -> None:
+ """
+ Write the bytes from ``out_buffer`` to the device, then immediately
+ reads into ``in_buffer`` from the device. The number of bytes read
+ will be the length of ``in_buffer``.
+
+ If ``out_start`` or ``out_end`` is provided, then the output buffer
+ will be sliced as if ``out_buffer[out_start:out_end]``. This will
+ not cause an allocation like ``buffer[out_start:out_end]`` will so
+ it saves memory.
+
+ If ``in_start`` or ``in_end`` is provided, then the input buffer
+ will be sliced as if ``in_buffer[in_start:in_end]``. This will not
+ cause an allocation like ``in_buffer[in_start:in_end]`` will so
+ it saves memory.
+
+ :param ~ReadableBuffer out_buffer: buffer containing the bytes to write
+ :param ~WriteableBuffer in_buffer: buffer containing the bytes to read into
+ :param int out_start: Index to start writing from
+ :param int out_end: Index to read up to but not include; if None, use ``len(out_buffer)``
+ :param int in_start: Index to start writing at
+ :param int in_end: Index to write up to but not include; if None, use ``len(in_buffer)``
+ """
+ if out_end is None:
+ out_end = len(out_buffer)
+ if in_end is None:
+ in_end = len(in_buffer)
+
+ self.i2c.writeto_then_readfrom(
+ self.device_address,
+ out_buffer,
+ in_buffer,
+ out_start=out_start,
+ out_end=out_end,
+ in_start=in_start,
+ in_end=in_end,
+ )
+
+ # pylint: enable-msg=too-many-arguments
+
+ def __enter__(self) -> "I2CDevice":
+ while not self.i2c.try_lock():
+ pass
+ return self
+
+ def __exit__(
+ self,
+ exc_type: Optional[Type[type]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> bool:
+ self.i2c.unlock()
+ return False
+
+ def __probe_for_device(self) -> None:
+ """
+ Try to read a byte from an address,
+ if you get an OSError it means the device is not there
+ or that the device does not support these means of probing
+ """
+ while not self.i2c.try_lock():
+ pass
+ try:
+ self.i2c.writeto(self.device_address, b"")
+ except OSError:
+ # some OS's dont like writing an empty bytesting...
+ # Retry by reading a byte
+ try:
+ result = bytearray(1)
+ self.i2c.readfrom_into(self.device_address, result)
+ except OSError:
+ # pylint: disable=raise-missing-from
+ raise ValueError("No I2C device at address: 0x%x" % self.device_address)
+ # pylint: enable=raise-missing-from
+ finally:
+ self.i2c.unlock()
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/spi_device.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/spi_device.py
new file mode 100644
index 0000000..f4b825a
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/adafruit_bus_device/spi_device.py
@@ -0,0 +1,117 @@
+# SPDX-FileCopyrightText: 2016 Scott Shawcroft for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+# pylint: disable=too-few-public-methods
+
+"""
+`adafruit_bus_device.spi_device` - SPI Bus Device
+====================================================
+"""
+
+try:
+ from typing import Optional, Type
+ from types import TracebackType
+
+ # Used only for type annotations.
+ from busio import SPI
+ from digitalio import DigitalInOut
+except ImportError:
+ pass
+
+
+__version__ = "0.0.0-auto.0"
+__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git"
+
+
+class SPIDevice:
+ """
+ Represents a single SPI device and manages locking the bus and the device
+ address.
+
+ :param ~busio.SPI spi: The SPI bus the device is on
+ :param ~digitalio.DigitalInOut chip_select: The chip select pin object that implements the
+ DigitalInOut API.
+ :param bool cs_active_value: Set to true if your device requires CS to be active high.
+ Defaults to false.
+ :param int baudrate: The SPI baudrate
+ :param int polarity: The SPI polarity
+ :param int phase: The SPI phase
+ :param int extra_clocks: The minimum number of clock cycles to cycle the bus after CS is high.
+ (Used for SD cards.)
+
+ .. note:: This class is **NOT** built into CircuitPython. See
+ :ref:`here for install instructions <bus_device_installation>`.
+
+ Example:
+
+ .. code-block:: python
+
+ import busio
+ import digitalio
+ from board import *
+ from adafruit_bus_device.spi_device import SPIDevice
+
+ with busio.SPI(SCK, MOSI, MISO) as spi_bus:
+ cs = digitalio.DigitalInOut(D10)
+ device = SPIDevice(spi_bus, cs)
+ bytes_read = bytearray(4)
+ # The object assigned to spi in the with statements below
+ # is the original spi_bus object. We are using the busio.SPI
+ # operations busio.SPI.readinto() and busio.SPI.write().
+ with device as spi:
+ spi.readinto(bytes_read)
+ # A second transaction
+ with device as spi:
+ spi.write(bytes_read)
+ """
+
+ def __init__(
+ self,
+ spi: SPI,
+ chip_select: Optional[DigitalInOut] = None,
+ *,
+ cs_active_value: bool = False,
+ baudrate: int = 100000,
+ polarity: int = 0,
+ phase: int = 0,
+ extra_clocks: int = 0
+ ) -> None:
+ self.spi = spi
+ self.baudrate = baudrate
+ self.polarity = polarity
+ self.phase = phase
+ self.extra_clocks = extra_clocks
+ self.chip_select = chip_select
+ self.cs_active_value = cs_active_value
+ if self.chip_select:
+ self.chip_select.switch_to_output(value=True)
+
+ def __enter__(self) -> SPI:
+ while not self.spi.try_lock():
+ pass
+ self.spi.configure(
+ baudrate=self.baudrate, polarity=self.polarity, phase=self.phase
+ )
+ if self.chip_select:
+ self.chip_select.value = self.cs_active_value
+ return self.spi
+
+ def __exit__(
+ self,
+ exc_type: Optional[Type[type]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> bool:
+ if self.chip_select:
+ self.chip_select.value = not self.cs_active_value
+ if self.extra_clocks > 0:
+ buf = bytearray(1)
+ buf[0] = 0xFF
+ clocks = self.extra_clocks // 8
+ if self.extra_clocks % 8 != 0:
+ clocks += 1
+ for _ in range(clocks):
+ self.spi.write(buf)
+ self.spi.unlock()
+ return False
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico
new file mode 100644
index 0000000..5aca983
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico
Binary files differ
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico.license b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico.license
new file mode 100644
index 0000000..86a3fbf
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/_static/favicon.ico.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2018 Phillip Torrone for Adafruit Industries
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst
new file mode 100644
index 0000000..17b4ce3
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst
@@ -0,0 +1,8 @@
+
+.. If you created a package, create one automodule per module in the package.
+
+.. automodule:: adafruit_bus_device.i2c_device
+ :members:
+
+.. automodule:: adafruit_bus_device.spi_device
+ :members:
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst.license
new file mode 100644
index 0000000..9aae48d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/api.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/conf.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/conf.py
new file mode 100644
index 0000000..f1f440c
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/conf.py
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*-
+
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath(".."))
+
+# -- General configuration ------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx",
+ "sphinx.ext.viewcode",
+]
+
+# Uncomment the below if you use native CircuitPython modules such as
+# digitalio, micropython and busio. List the modules you use. Without it, the
+# autodoc module docs will fail to generate with a warning.
+# autodoc_mock_imports = []
+
+intersphinx_mapping = {
+ "python": ("https://docs.python.org/3", None),
+ "BusDevice": (
+ "https://docs.circuitpython.org/projects/busdevice/en/latest/",
+ None,
+ ),
+ "CircuitPython": ("https://docs.circuitpython.org/en/latest/", None),
+}
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+source_suffix = ".rst"
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = "Adafruit CircuitPython Bus Device"
+copyright = "2016-2017 Scott Shawcroft and Tony Dicola for Adafruit Industries"
+author = "Scott Shawcroft and Tony Dicola"
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = "1.0"
+# The full version, including alpha/beta/rc tags.
+release = "1.0"
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".env", "CODE_OF_CONDUCT.md"]
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#
+default_role = "any"
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#
+add_function_parentheses = True
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "sphinx"
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+# If this is True, todo emits a warning for each TODO entries. The default is False.
+todo_emit_warnings = True
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+on_rtd = os.environ.get("READTHEDOCS", None) == "True"
+
+if not on_rtd: # only import and set the theme if we're building docs locally
+ try:
+ import sphinx_rtd_theme
+
+ html_theme = "sphinx_rtd_theme"
+ html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."]
+ except:
+ html_theme = "default"
+ html_theme_path = ["."]
+else:
+ html_theme_path = ["."]
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#
+html_favicon = "_static/favicon.ico"
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "AdafruitBusDeviceLibrarydoc"
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+ # The paper size ('letterpaper' or 'a4paper').
+ #
+ # 'papersize': 'letterpaper',
+ # The font size ('10pt', '11pt' or '12pt').
+ #
+ # 'pointsize': '10pt',
+ # Additional stuff for the LaTeX preamble.
+ #
+ # 'preamble': '',
+ # Latex figure (float) alignment
+ #
+ # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (
+ master_doc,
+ "AdafruitBusDeviceLibrary.tex",
+ "Adafruit Bus Device Library Documentation",
+ author,
+ "manual",
+ ),
+]
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (
+ master_doc,
+ "AdafruitBusDeviceLibrary",
+ "Adafruit Bus Device Library Documentation",
+ [author],
+ 1,
+ )
+]
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (
+ master_doc,
+ "AdafruitBusDeviceLibrary",
+ "Adafruit Bus Device Library Documentation",
+ author,
+ "AdafruitBusDeviceLibrary",
+ "One line description of project.",
+ "Miscellaneous",
+ ),
+]
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst
new file mode 100644
index 0000000..abd05c4
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst
@@ -0,0 +1,12 @@
+Simple test
+------------
+
+Ensure your device works with this simple test.
+
+.. literalinclude:: ../examples/busdevice_read_register_i2c_simpletest.py
+ :caption: examples/busdevice_read_register_i2c_simpletest.py
+ :linenos:
+
+.. literalinclude:: ../examples/busdevice_read_register_spi_simpletest.py
+ :caption: examples/busdevice_read_register_spi_simpletest.py
+ :linenos:
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst.license
new file mode 100644
index 0000000..9aae48d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/examples.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst
new file mode 100644
index 0000000..dac7838
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst
@@ -0,0 +1,45 @@
+.. include:: ../README.rst
+
+Table of Contents
+=================
+
+.. toctree::
+ :maxdepth: 4
+ :hidden:
+
+ self
+
+.. toctree::
+ :caption: Examples
+
+ examples
+
+.. toctree::
+ :caption: API Reference
+ :maxdepth: 3
+
+ api
+
+.. toctree::
+ :caption: Tutorials
+
+.. toctree::
+ :caption: Related Products
+
+.. toctree::
+ :caption: Other Links
+
+ Download <https://github.com/adafruit/Adafruit_CircuitPython_BusDevice/releases/latest>
+ CircuitPython Reference Documentation <https://docs.circuitpython.org>
+ CircuitPython Support Forum <https://forums.adafruit.com/viewforum.php?f=60>
+ Discord Chat <https://adafru.it/discord>
+ Adafruit Learning System <https://learn.adafruit.com>
+ Adafruit Blog <https://blog.adafruit.com>
+ Adafruit Store <https://www.adafruit.com>
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst.license
new file mode 100644
index 0000000..9aae48d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/index.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/requirements.txt b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/docs/requirements.txt
new file mode 100644
index 0000000..88e6733
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/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/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_i2c_simpletest.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_i2c_simpletest.py
new file mode 100644
index 0000000..c3d78f8
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_i2c_simpletest.py
@@ -0,0 +1,20 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+# SPDX-License-Identifier: MIT
+
+import busio
+import board
+from adafruit_bus_device.i2c_device import I2CDevice
+
+DEVICE_ADDRESS = 0x68 # device address of DS3231 board
+A_DEVICE_REGISTER = 0x0E # device id register on the DS3231 board
+
+# The follow is for I2C communications
+comm_port = busio.I2C(board.SCL, board.SDA)
+device = I2CDevice(comm_port, DEVICE_ADDRESS)
+
+with device as bus_device:
+ bus_device.write(bytes([A_DEVICE_REGISTER]))
+ result = bytearray(1)
+ bus_device.readinto(result)
+
+print("".join("{:02x}".format(x) for x in result))
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_spi_simpletest.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_spi_simpletest.py
new file mode 100644
index 0000000..995f7de
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/examples/busdevice_read_register_spi_simpletest.py
@@ -0,0 +1,22 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+# SPDX-License-Identifier: MIT
+
+import busio
+import board
+import digitalio
+from adafruit_bus_device.spi_device import SPIDevice
+
+A_DEVICE_REGISTER = 0xD0 # device id register on the BMP280 board
+
+# The follow is for SPI communications
+cs = digitalio.DigitalInOut(board.A2)
+comm_port = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
+device = SPIDevice(comm_port, cs)
+
+# pylint: disable-msg=no-member
+with device as bus_device:
+ bus_device.write(bytes([A_DEVICE_REGISTER]))
+ result = bytearray(1)
+ bus_device.readinto(result)
+
+print("".join("{:02x}".format(x) for x in result))
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/requirements.txt b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/requirements.txt
new file mode 100644
index 0000000..f2ef0cc
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/requirements.txt
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+Adafruit-Blinka>=7.0.0
+adafruit-circuitpython-typing
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/setup.py b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/setup.py
new file mode 100755
index 0000000..99ded02
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_BusDevice/setup.py
@@ -0,0 +1,55 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+"""A setuptools based setup module.
+
+See:
+https://packaging.python.org/en/latest/distributing.html
+https://github.com/pypa/sampleproject
+"""
+
+# Always prefer setuptools over distutils
+from setuptools import setup, find_packages
+
+# To use a consistent encoding
+from codecs import open
+from os import path
+
+here = path.abspath(path.dirname(__file__))
+
+# Get the long description from the README file
+with open(path.join(here, "README.rst"), encoding="utf-8") as f:
+ long_description = f.read()
+
+setup(
+ name="adafruit-circuitpython-busdevice",
+ use_scm_version=True,
+ setup_requires=["setuptools_scm"],
+ description="CircuitPython bus device classes to manage bus sharing.",
+ long_description=long_description,
+ long_description_content_type="text/x-rst",
+ # The project's main homepage.
+ url="https://github.com/adafruit/Adafruit_CircuitPython_BusDevice",
+ # Author details
+ author="Adafruit Industries",
+ author_email="circuitpython@adafruit.com",
+ python_requires=">=3.7.0",
+ install_requires=["Adafruit-Blinka>=7.0.0", "adafruit-circuitpython-typing"],
+ # Choose your license
+ license="MIT",
+ # See https://pypi.python.org/pypi?%3Aaction=list_classifiers
+ classifiers=[
+ "Development Status :: 3 - Alpha",
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries",
+ "Topic :: System :: Hardware",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python :: 3",
+ ],
+ # What does your project relate to?
+ keywords="adafruit spi i2c bus device micropython circuitpython",
+ # You can just specify the packages manually here if your project is
+ # simple. Or you can use find_packages().
+ packages=["adafruit_bus_device"],
+)