circuitpython/extmod
Damien George 1b578fe2c0 extmod/machine_i2c_target: Add new machine.I2CTarget class.
This commit implements a generic I2C target/peripheral/"slave" device,
called `machine.I2CTarget`.  It can work in two separate modes:

- A general device with interrupts/events/callbacks for low-level I2C
  operations like address match, read request and stop.

- A memory device that allows reading/writing a specific region of memory
  (or "registers") on the target I2C device.

To make a memory device is very simple:

    from machine import I2CTarget

    mem = bytearray(8)
    i2c = I2CTarget(addr=67, mem=mem)

That's all that's needed to start the I2C target.  From then on it will
respond to any I2C controller on the bus, allowing reads and writes to the
mem bytearray.

It's also possible to register to receive events.  For example to be
notified when the memory is read/written:

    from machine import I2CTarget

    def irq_handler(i2c_target):
        flags = i2c_target.irq().flags()
        if flags & I2CTarget.IRQ_END_READ:
            print("controller read target at addr", i2c_target.memaddr)
        if flags & I2CTarget.IRQ_END_WRITE:
            print("controller wrote target at addr", i2c_target.memaddr)

    mem = bytearray(8)
    i2c = I2CTarget(addr=67, mem=mem)
    i2c.irq(irq_handler)

Instead of a memory device, an arbitrary I2C device can be implemented
using all the events (see docs).

This is based on the discussion in #3935.

Signed-off-by: Damien George <damien@micropython.org>
2025-08-01 23:03:17 +10:00
..
asyncio extmod/asyncio: Fix early exit of asyncio scheduler. 2025-05-07 14:56:47 +10:00
axtls-include all: Prune trailing whitespace. 2024-03-07 16:25:17 +11:00
berkeley-db all: Update extmod, ports, examples to build with new berkeley-db lib. 2024-03-16 12:19:12 +11:00
btstack extmod/modbluetooth: Add timeout to deinit. 2025-06-04 02:21:32 +10:00
libmetal extmod/libmetal: Fix libmetal rules for mkdir dependencies. 2024-09-06 17:14:03 +10:00
littlefs-include lib/littlefs: Reuse existing CRC32 function to save space. 2025-05-07 17:03:28 +10:00
lwip-include extmod/network_lwip: Add sys_untimeout_all_with_arg helper function. 2025-07-17 13:38:58 +10:00
mbedtls extmod/mbedtls: Undefine ARRAY_SIZE if defined by platform. 2025-07-23 15:47:17 +10:00
nimble extmod/modbluetooth: Add timeout to deinit. 2025-06-04 02:21:32 +10:00
cyw43_config_common.h rp2,extmod/cyw43: Move the LWIP responder fix into common CYW43 config. 2025-05-08 15:32:05 +10:00
extmod.cmake extmod/machine_i2c_target: Add new machine.I2CTarget class. 2025-08-01 23:03:17 +10:00
extmod.mk extmod/machine_i2c_target: Add new machine.I2CTarget class. 2025-08-01 23:03:17 +10:00
font_petme128_8x8.h extmod: Move font_petme128_8x8.h from ports/stm32 to extmod. 2022-05-05 13:30:40 +10:00
machine_adc.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_adc_block.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_bitstream.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_i2c.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_i2c_target.c extmod/machine_i2c_target: Add new machine.I2CTarget class. 2025-08-01 23:03:17 +10:00
machine_i2s.c esp32/machine_i2s: Integrate new I2S IDF driver. 2024-03-08 13:31:02 +11:00
machine_mem.c extmod/modmachine: Add MICROPY_PY_MACHINE_MEMX configuration option. 2024-03-15 12:04:34 +11:00
machine_pinbase.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_pulse.c esp8266/modmachine: Use common machine_time_pulse_us implementation. 2025-06-13 16:27:35 +10:00
machine_pwm.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_signal.c extmod/modmachine: Add MICROPY_PY_MACHINE_SIGNAL configuration option. 2024-03-15 12:04:25 +11:00
machine_spi.c extmod/machine_spi: Support firstbit=LSB for machine.SoftSPI. 2024-07-12 22:59:31 +10:00
machine_timer.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_uart.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
machine_usb_device.c extmod/machine_usb_device: Add exception text wrappers. 2025-04-22 11:29:32 +10:00
machine_wdt.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
misc.h extmod/os_dupterm: Let mp_os_dupterm_tx_strn() return num bytes written. 2023-12-22 10:26:52 +11:00
modasyncio.c extmod/modasyncio: Add support for a callback on TaskQueue push. 2024-06-20 00:11:05 +10:00
modbinascii.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modbluetooth.c extmod/modbluetooth: Add timeout to deinit. 2025-06-04 02:21:32 +10:00
modbluetooth.h extmod/modbluetooth: Add timeout to deinit. 2025-06-04 02:21:32 +10:00
modbtree.c extmod/modbtree: Add checks for already-closed database. 2024-07-22 10:42:29 +10:00
modcryptolib.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
moddeflate.c extmod/moddeflate: Keep DeflateIO state consistent on window alloc fail. 2025-03-27 11:58:59 +11:00
modframebuf.c extmod/modframebuf: Add support for blit'ing read-only data. 2025-06-04 02:40:45 +10:00
modhashlib.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modheapq.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modjson.c extmod/modjson: Detect unterminated composite entities. 2025-05-19 02:09:40 +02:00
modlwip.c extmod/modlwip: Print timeout with correct format string. 2025-07-25 10:59:51 +10:00
modmachine.c extmod/machine_i2c_target: Add new machine.I2CTarget class. 2025-08-01 23:03:17 +10:00
modmachine.h extmod/machine_i2c_target: Add new machine.I2CTarget class. 2025-08-01 23:03:17 +10:00
modmarshal.c extmod/modmarshal: Add new marshal module. 2025-02-11 16:54:20 +11:00
modnetwork.c extmod/modnetwork: Consolidate definition of common drivers. 2025-06-10 11:20:38 +10:00
modnetwork.h extmod/network_lwip: Add sys_untimeout_all_with_arg helper function. 2025-07-17 13:38:58 +10:00
modonewire.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modopenamp.c extmod/modopenamp: Use mp_event_* functions for poll/wait. 2024-08-08 18:02:21 +10:00
modopenamp.h extmod/modopenamp_remoteproc: Add new OpenAMP RemoteProc class. 2024-03-15 18:11:28 +11:00
modopenamp_remoteproc.c extmod/modopenamp: Add support for building Open-AMP on device side. 2024-08-08 17:59:32 +10:00
modopenamp_remoteproc.h extmod/modopenamp_remoteproc: Add new OpenAMP RemoteProc class. 2024-03-15 18:11:28 +11:00
modopenamp_remoteproc_store.c extmod/modopenamp: Add support for building Open-AMP on device side. 2024-08-08 17:59:32 +10:00
modos.c extmod/vfs: Guard mutating fs functions with MICROPY_VFS_WRITABLE. 2024-12-20 21:58:50 +11:00
modplatform.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modplatform.h extmod/modplatform: Distinguish RISC-V 64 from RISC-V 32. 2024-12-10 12:10:36 +11:00
modrandom.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modre.c extmod/modre: Use specific error message if regex is too complex. 2025-06-10 15:14:56 +10:00
modselect.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modsocket.c extmod/modsocket: Add missing static in private function definitions. 2025-01-02 13:33:39 +11:00
modtime.c shared/timeutils: Standardize supported date range on all platforms. 2025-07-09 11:54:21 +10:00
modtime.h all: Rename *umodule*.h to remove the "u" prefix. 2023-06-08 17:54:14 +10:00
modtls_axtls.c all: Rename the "NORETURN" macro to "MP_NORETURN". 2025-05-13 10:36:47 +10:00
modtls_mbedtls.c extmod/modtls_mbedtls: Do gc_collect and retry ssl_init on any error. 2025-07-31 10:46:47 +10:00
moductypes.c all: Rename the "NORETURN" macro to "MP_NORETURN". 2025-05-13 10:36:47 +10:00
modvfs.c extmod/modvfs: Add vfs.rom_ioctl function and its ioctl constants. 2025-03-06 12:52:35 +11:00
modwebrepl.c all: Use new mp_obj_new_str_from_cstr() function. 2024-07-04 15:55:03 +10:00
modwebsocket.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
modwebsocket.h all: Rename *umodule*.h to remove the "u" prefix. 2023-06-08 17:54:14 +10:00
mpbthci.c extmod/modbluetooth: Refactor stack/hci/driver/port bindings. 2020-09-08 11:41:31 +10:00
mpbthci.h extmod,alif,mimxrt,rp2,stm32: Create common cyw43 driver config header. 2025-05-08 15:32:05 +10:00
network_cyw43.c extmod/network_cyw43: Disconnect STA if making inactive. 2025-05-20 23:14:41 +10:00
network_cyw43.h extmod: Add network-level class binding to cyw43 driver. 2019-06-03 16:47:35 +10:00
network_esp_hosted.c extmod/modnetwork: Consolidate definition of common drivers. 2025-06-10 11:20:38 +10:00
network_lwip.c extmod/network_lwip: Add sys_untimeout_all_with_arg helper function. 2025-07-17 13:38:58 +10:00
network_ninaw10.c extmod/network_nina: Fix the AP security mode constants. 2024-07-12 01:03:46 +10:00
network_ppp_lwip.c esp32/network_ppp: Restructure to match extmod/network_ppp_lwip. 2025-05-15 11:56:14 +10:00
network_wiznet5k.c extmod/modnetwork: Consolidate definition of common drivers. 2025-06-10 11:20:38 +10:00
os_dupterm.c extmod/os_dupterm: Handle exception properly when it occurs in parallel. 2024-03-16 10:59:03 +11:00
vfs.c extmod/vfs: Return mount table from no-args vfs.mount call. 2025-03-27 16:37:04 +11:00
vfs.h extmod/vfs: Add mp_vfs_mount_romfs_protected() helper. 2025-03-06 12:52:35 +11:00
vfs_blockdev.c extmod/vfs_blockdev: Support bool return from Python read/write blocks. 2024-11-13 14:21:29 +11:00
vfs_fat.c shared/timeutils: Standardize supported date range on all platforms. 2025-07-09 11:54:21 +10:00
vfs_fat.h extmod: Factor out block-device struct to make independent of fatfs. 2019-10-29 12:12:37 +11:00
vfs_fat_diskio.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
vfs_fat_file.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
vfs_lfs.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
vfs_lfs.h extmod: Add VFS littlefs bindings. 2019-10-29 14:17:29 +11:00
vfs_lfsx.c extmod/vfs_lfsx: Allow overriding the LFS2 on-disk version format. 2025-07-23 15:51:08 +10:00
vfs_lfsx_file.c all: Remove the "STATIC" macro and just use "static" instead. 2024-03-07 14:20:42 +11:00
vfs_posix.c extmod/vfs_posix: Add MICROPY_VFS_POSIX_WRITABLE option. 2025-07-24 10:39:41 +10:00
vfs_posix.h extmod/vfs: Introduce a C-level VFS protocol, with fast import_stat. 2018-06-06 14:33:42 +10:00
vfs_posix_file.c extmod/vfs_posix_file: Skip flush of tty handles in msvc debug builds. 2024-10-09 15:03:07 +11:00
vfs_reader.c extmod/vfs_reader: Add support for opening a memory-mappable file. 2024-12-23 13:04:54 +11:00
vfs_rom.c extmod/vfs_rom: Implement minimal VfsRom.getcwd() method. 2025-03-27 17:04:12 +11:00
vfs_rom.h extmod/vfs_rom: Add VfsRom filesystem object. 2024-12-23 13:04:54 +11:00
vfs_rom_file.c extmod/vfs_rom: Add VfsRom filesystem object. 2024-12-23 13:04:54 +11:00
virtpin.c py/obj: Add accessors for type slots and use everywhere. 2022-09-19 19:06:07 +10:00
virtpin.h all: Unify header guard usage. 2017-07-18 11:57:39 +10:00