diff --git a/boards/SUMMARY.md b/boards/SUMMARY.md
index c708a75..41ade8a 100644
--- a/boards/SUMMARY.md
+++ b/boards/SUMMARY.md
@@ -8,6 +8,9 @@
- [BW12](../boards/bw12/README.md)
- [BW15](../boards/bw15/README.md)
- [CB2S](../boards/cb2s/README.md)
+- [CB3L](../boards/cb3l/README.md)
+- [CB3S](../boards/cb3s/README.md)
+- [CB3SE](../boards/cb3se/README.md)
- [WB2L](../boards/wb2l/README.md)
- [WB2S](../boards/wb2s/README.md)
- [WB3L](../boards/wb3l/README.md)
diff --git a/boards/_base/pcb/cb3l.json b/boards/_base/pcb/cb3l.json
new file mode 100644
index 0000000..d615abe
--- /dev/null
+++ b/boards/_base/pcb/cb3l.json
@@ -0,0 +1,83 @@
+{
+ "pcb": {
+ "templates": [
+ "esp12s",
+ "esp12e-shield",
+ "tuya-16x24",
+ "rf-16mm-type1"
+ ],
+ "vars": {
+ "MASK_PRESET": "mask_blue_light",
+ "TRACE_COLOR": "#58839B",
+ "SILK_COLOR": "white",
+ "PINTYPE_VERT": "pin_vert_2mm_cast_hole",
+ "PINTYPE_HORZ": "pin_horz_2mm_cast_hole"
+ },
+ "pinout_hidden": "I2S,SD,SPI,I2C,JTAG,FLASH",
+ "pinout": {
+ "1": {
+ "IC": 21
+ },
+ "2": {
+ "IC": 17,
+ "ARD": [
+ "D0",
+ "A0"
+ ]
+ },
+ "3": {
+ "IC": 21
+ },
+ "4": {
+ "IC": 11,
+ "ARD": "D1"
+ },
+ "5": {
+ "IC": 15,
+ "ARD": "D2"
+ },
+ "6": {
+ "IC": 16,
+ "ARD": "D3"
+ },
+ "7": {
+ "IC": 22,
+ "ARD": "D4"
+ },
+ "8": {
+ "PWR": 3.3
+ },
+ "9": {
+ "GND": null
+ },
+ "10": {
+ "IC": 25,
+ "ARD": "D5"
+ },
+ "11": {
+ "IC": 29,
+ "ARD": "D6"
+ },
+ "12": {
+ "IC": 19,
+ "ARD": "D7"
+ },
+ "13": {
+ "IC": 24,
+ "ARD": "D8"
+ },
+ "14": {
+ "IC": 23,
+ "ARD": "D9"
+ },
+ "15": {
+ "IC": 26,
+ "ARD": "D10"
+ },
+ "16": {
+ "IC": 27,
+ "ARD": "D11"
+ }
+ }
+ }
+}
diff --git a/boards/_base/pcb/cb3s.json b/boards/_base/pcb/cb3s.json
new file mode 100644
index 0000000..aca2d5d
--- /dev/null
+++ b/boards/_base/pcb/cb3s.json
@@ -0,0 +1,108 @@
+{
+ "pcb": {
+ "templates": [
+ "esp12e-22",
+ "esp12e-shield-nohole",
+ "tuya-16x24",
+ "rf-16mm-type1"
+ ],
+ "vars": {
+ "MASK_PRESET": "mask_blue_light",
+ "TRACE_COLOR": "#58839B",
+ "SILK_COLOR": "white",
+ "PINTYPE_VERT": "pin_vert_2mm_cast_nohole",
+ "PINTYPE_HORZ": "pin_horz_2mm_cast_nohole"
+ },
+ "pinout_hidden": "I2S,SD,SPI,SCL2",
+ "pinout": {
+ "1": {
+ "IC": 21
+ },
+ "2": {
+ "IC": 17,
+ "ARD": [
+ "D0",
+ "A0"
+ ]
+ },
+ "3": {
+ "IC": 21
+ },
+ "4": {
+ "IC": 11,
+ "ARD": "D1"
+ },
+ "5": {
+ "IC": 15,
+ "ARD": "D2"
+ },
+ "6": {
+ "IC": 16,
+ "ARD": "D3"
+ },
+ "7": {
+ "IC": 22,
+ "ARD": "D4"
+ },
+ "8": {
+ "PWR": 3.3
+ },
+ "9": {
+ "GND": null
+ },
+ "10": {
+ "IC": 25,
+ "ARD": "D5"
+ },
+ "11": {
+ "IC": 29,
+ "ARD": "D6"
+ },
+ "12": {
+ "IC": 19,
+ "ARD": "D7"
+ },
+ "13": {
+ "IC": 24,
+ "ARD": "D8"
+ },
+ "14": {
+ "IC": 23,
+ "ARD": "D9"
+ },
+ "15": {
+ "IC": 26,
+ "ARD": "D10"
+ },
+ "16": {
+ "IC": 27,
+ "ARD": "D11"
+ },
+ "17": {
+ "IC": 17,
+ "ARD": [
+ "D0",
+ "A0"
+ ]
+ },
+ "18": {
+ "IC": 18,
+ "ARD": "D12"
+ },
+ "19": {
+ "IC": 19,
+ "ARD": "D7"
+ },
+ "20": {
+ "IC": 20,
+ "ARD": "D13"
+ },
+ "21": {
+ "NC": null
+ },
+ "22": {
+ "NC": null
+ }
+ }
+ }
+}
diff --git a/boards/_base/pcb/cb3se.json b/boards/_base/pcb/cb3se.json
new file mode 100644
index 0000000..da4e464
--- /dev/null
+++ b/boards/_base/pcb/cb3se.json
@@ -0,0 +1,106 @@
+{
+ "pcb": {
+ "templates": [
+ "esp12e-22",
+ "esp12e-shield-nohole",
+ "tuya-16x24",
+ "rf-16mm-type1"
+ ],
+ "vars": {
+ "MASK_PRESET": "mask_blue_light",
+ "TRACE_COLOR": "#58839B",
+ "SILK_COLOR": "white",
+ "PINTYPE_VERT": "pin_vert_2mm_cast_nohole",
+ "PINTYPE_HORZ": "pin_horz_2mm_cast_nohole"
+ },
+ "pinout_hidden": "I2S,SD,JTAG,FLASH,SCL1",
+ "pinout": {
+ "1": {
+ "IC": 21
+ },
+ "2": {
+ "IC": 17,
+ "ARD": [
+ "D0",
+ "A0"
+ ]
+ },
+ "3": {
+ "IC": 21
+ },
+ "4": {
+ "IC": 11,
+ "ARD": "D1"
+ },
+ "5": {
+ "IC": 15,
+ "ARD": "D2"
+ },
+ "6": {
+ "IC": 16,
+ "ARD": "D3"
+ },
+ "7": {
+ "IC": 22,
+ "ARD": "D4"
+ },
+ "8": {
+ "PWR": 3.3
+ },
+ "9": {
+ "GND": null
+ },
+ "10": {
+ "IC": 25,
+ "ARD": "D5"
+ },
+ "11": {
+ "IC": 29,
+ "ARD": "D6"
+ },
+ "12": {
+ "IC": 28,
+ "ARD": "D7"
+ },
+ "13": {
+ "IC": 24,
+ "ARD": "D8"
+ },
+ "14": {
+ "IC": 23,
+ "ARD": "D9"
+ },
+ "15": {
+ "IC": 26,
+ "ARD": "D10"
+ },
+ "16": {
+ "IC": 27,
+ "ARD": "D11"
+ },
+ "17": {
+ "IC": 13,
+ "ARD": "D12"
+ },
+ "18": {
+ "IC": 18,
+ "ARD": "D13"
+ },
+ "19": {
+ "GND": null
+ },
+ "20": {
+ "IC": 20,
+ "ARD": "D14"
+ },
+ "21": {
+ "IC": 14,
+ "ARD": "D15"
+ },
+ "22": {
+ "IC": 12,
+ "ARD": "D16"
+ }
+ }
+ }
+}
diff --git a/boards/cb3l.json b/boards/cb3l.json
new file mode 100644
index 0000000..0d42b11
--- /dev/null
+++ b/boards/cb3l.json
@@ -0,0 +1,19 @@
+{
+ "_base": [
+ "beken-72xx",
+ "beken-7231n",
+ "beken-7231n-tuya",
+ "pcb/ic-bk7231-qfn32",
+ "pcb/cb3l"
+ ],
+ "build": {
+ "mcu": "bk7231n",
+ "variant": "cb3l"
+ },
+ "name": "CB3L Wi-Fi Module",
+ "url": "https://developer.tuya.com/en/docs/iot/cb3l-module-datasheet?id=Kai51ngmrh3qm",
+ "vendor": "Tuya Inc.",
+ "pcb": {
+ "symbol": "CB3L"
+ }
+}
diff --git a/boards/cb3l/README.md b/boards/cb3l/README.md
new file mode 100644
index 0000000..7daddb0
--- /dev/null
+++ b/boards/cb3l/README.md
@@ -0,0 +1,76 @@
+# CB3L Wi-Fi Module
+
+*by Tuya Inc.*
+
+[Product page](https://developer.tuya.com/en/docs/iot/cb3l-module-datasheet?id=Kai51ngmrh3qm)
+
+- [General info](../../docs/platform/beken-72xx/README.md)
+- [Flashing guide](../../docs/platform/beken-72xx/flashing.md)
+- [BkWriter v1.6.0](https://images.tuyacn.com/smart/bk_writer1.60/bk_writer1.60.exe)
+
+Parameter | Value
+-------------|----------------------------------
+Board code | `cb3l`
+MCU | BK7231N
+Manufacturer | Beken
+Series | BK72XX
+Frequency | 120 MHz
+Flash size | 2 MiB
+RAM size | 256 KiB
+Voltage | 3.0V - 3.6V
+I/O | 12x GPIO, 6x PWM, 2x UART, 1x ADC
+Wi-Fi | 802.11 b/g/n
+Bluetooth | BLE v5.1
+
+## Usage
+
+**Board code:** `cb3l`
+
+In `platformio.ini`:
+
+```ini
+[env:cb3l]
+platform = libretuya
+board = cb3l
+framework = arduino
+```
+
+## Pinout
+
+
+
+## Arduino Core pin mapping
+
+No. | Pin | UART | I²C | SPI | PWM | Other
+----|-----------|----------|----------|-----|------|------
+D0 | P23 | | | | | TDO
+D1 | P14 | | | SCK | |
+D2 | P26 | | | | PWM5 |
+D3 | P24 | | | | PWM4 |
+D4 | P6 | | | | PWM0 |
+D5 | P9 | | | | PWM3 |
+D6 | P0 | UART2_TX | I2C2_SCL | | |
+D7 | P21 | | I2C1_SDA | | | TMS
+D8 | P8 | | | | PWM2 |
+D9 | P7 | | | | PWM1 |
+D10 | P10 | UART1_RX | | | |
+D11 | P11 | UART1_TX | | | |
+A0 | P23, ADC3 | | | | |
+
+## Flash memory map
+
+Flash size: 2 MiB / 2,097,152 B / 0x200000
+
+Hex values are in bytes.
+
+Name | Start | Length | End
+----------------|----------|--------------------|---------
+Bootloader | 0x000000 | 68 KiB / 0x11000 | 0x011000
+App Image | 0x011000 | 1.1 MiB / 0x119000 | 0x12A000
+OTA Image | 0x12A000 | 664 KiB / 0xA6000 | 0x1D0000
+TLV Store | 0x1D0000 | 4 KiB / 0x1000 | 0x1D1000
+Network Data | 0x1D1000 | 8 KiB / 0x2000 | 0x1D3000
+Key-Value Store | 0x1D3000 | 32 KiB / 0x8000 | 0x1DB000
+User Data | 0x1DB000 | 148 KiB / 0x25000 | 0x200000
+
+Bootloader and app partitions contain CRC16 sums every 32 bytes. That results in the actual flash offsets/sizes not aligned to sector boundaries. To simplify calculations, the values shown in the table (extracted from bootloader's partition table) were aligned to 4096 bytes.
diff --git a/boards/cb3l/pinout_cb3l.svg b/boards/cb3l/pinout_cb3l.svg
new file mode 100644
index 0000000..35eb017
--- /dev/null
+++ b/boards/cb3l/pinout_cb3l.svg
@@ -0,0 +1,253 @@
+
+
diff --git a/boards/cb3l/pins_arduino.h b/boards/cb3l/pins_arduino.h
new file mode 100644
index 0000000..1de3ade
--- /dev/null
+++ b/boards/cb3l/pins_arduino.h
@@ -0,0 +1 @@
+#include "variant.h"
diff --git a/boards/cb3l/variant.cpp b/boards/cb3l/variant.cpp
new file mode 100644
index 0000000..df4de7d
--- /dev/null
+++ b/boards/cb3l/variant.cpp
@@ -0,0 +1,36 @@
+/* This file was auto-generated from cb3l.json using boardgen */
+
+#include
+
+extern "C" {
+
+// clang-format off
+PinInfo pinTable[PINS_COUNT] = {
+ // D0: P23, ADC3, TDO, FSO
+ {GPIO23, PIN_GPIO | PIN_IRQ | PIN_ADC | PIN_JTAG, PIN_NONE, 0},
+ // D1: P14, SD_CLK, SCK
+ {GPIO14, PIN_GPIO | PIN_IRQ | PIN_SPI, PIN_NONE, 0},
+ // D2: P26, PWM5, IRDA
+ {GPIO26, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D3: P24, PWM4
+ {GPIO24, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D4: P6, PWM0
+ {GPIO6, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D5: P9, PWM3
+ {GPIO9, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D6: P0, UART2_TX, I2C2_SCL
+ {GPIO0, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_UART, PIN_NONE, 0},
+ // D7: P21, I2C1_SDA, TMS, MCLK, ^FCS
+ {GPIO21, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_I2S | PIN_JTAG, PIN_NONE, 0},
+ // D8: P8, PWM2
+ {GPIO8, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D9: P7, PWM1
+ {GPIO7, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D10: P10, UART1_RX
+ {GPIO10, PIN_GPIO | PIN_IRQ | PIN_UART, PIN_NONE, 0},
+ // D11: P11, UART1_TX
+ {GPIO11, PIN_GPIO | PIN_IRQ | PIN_UART, PIN_NONE, 0},
+};
+// clang-format on
+
+} // extern "C"
diff --git a/boards/cb3l/variant.h b/boards/cb3l/variant.h
new file mode 100644
index 0000000..ac3916c
--- /dev/null
+++ b/boards/cb3l/variant.h
@@ -0,0 +1,33 @@
+/* This file was auto-generated from cb3l.json using boardgen */
+
+#pragma once
+
+#include
+
+// clang-format off
+
+// Pins
+// ----
+#define PINS_COUNT 12
+#define NUM_DIGITAL_PINS 12
+#define NUM_ANALOG_INPUTS 1
+#define NUM_ANALOG_OUTPUTS 0
+
+// Analog pins
+// -----------
+#define PIN_A0 0u // GPIO23
+#define A0 PIN_A0
+
+// SPI Interfaces
+// --------------
+#define SPI_INTERFACES_COUNT 0
+
+// Wire Interfaces
+// ---------------
+#define WIRE_INTERFACES_COUNT 0
+
+// Serial ports
+// ------------
+#define SERIAL_INTERFACES_COUNT 1
+#define PIN_SERIAL1_RX 10u // GPIO10
+#define PIN_SERIAL1_TX 11u // GPIO11
diff --git a/boards/cb3s.json b/boards/cb3s.json
new file mode 100644
index 0000000..f6cc230
--- /dev/null
+++ b/boards/cb3s.json
@@ -0,0 +1,19 @@
+{
+ "_base": [
+ "beken-72xx",
+ "beken-7231n",
+ "beken-7231n-tuya",
+ "pcb/ic-bk7231-qfn32",
+ "pcb/cb3s"
+ ],
+ "build": {
+ "mcu": "bk7231n",
+ "variant": "cb3s"
+ },
+ "name": "CB3S Wi-Fi Module",
+ "url": "https://developer.tuya.com/en/docs/iot/cb3s?id=Kai94mec0s076",
+ "vendor": "Tuya Inc.",
+ "pcb": {
+ "symbol": "CB3S"
+ }
+}
diff --git a/boards/cb3s/README.md b/boards/cb3s/README.md
new file mode 100644
index 0000000..cc1e721
--- /dev/null
+++ b/boards/cb3s/README.md
@@ -0,0 +1,78 @@
+# CB3S Wi-Fi Module
+
+*by Tuya Inc.*
+
+[Product page](https://developer.tuya.com/en/docs/iot/cb3s?id=Kai94mec0s076)
+
+- [General info](../../docs/platform/beken-72xx/README.md)
+- [Flashing guide](../../docs/platform/beken-72xx/flashing.md)
+- [BkWriter v1.6.0](https://images.tuyacn.com/smart/bk_writer1.60/bk_writer1.60.exe)
+
+Parameter | Value
+-------------|----------------------------------
+Board code | `cb3s`
+MCU | BK7231N
+Manufacturer | Beken
+Series | BK72XX
+Frequency | 120 MHz
+Flash size | 2 MiB
+RAM size | 256 KiB
+Voltage | 3.0V - 3.6V
+I/O | 14x GPIO, 6x PWM, 2x UART, 1x ADC
+Wi-Fi | 802.11 b/g/n
+Bluetooth | BLE v5.1
+
+## Usage
+
+**Board code:** `cb3s`
+
+In `platformio.ini`:
+
+```ini
+[env:cb3s]
+platform = libretuya
+board = cb3s
+framework = arduino
+```
+
+## Pinout
+
+
+
+## Arduino Core pin mapping
+
+No. | Pin | UART | I²C | SPI | PWM | Other
+----|-----------|----------|----------|-----|------|------
+D0 | P23 | | | | | TDO
+D1 | P14 | | | SCK | |
+D2 | P26 | | | | PWM5 |
+D3 | P24 | | | | PWM4 |
+D4 | P6 | | | | PWM0 |
+D5 | P9 | | | | PWM3 |
+D6 | P0 | UART2_TX | I2C2_SCL | | |
+D7 | P21 | | I2C1_SDA | | | TMS
+D8 | P8 | | | | PWM2 |
+D9 | P7 | | | | PWM1 |
+D10 | P10 | UART1_RX | | | |
+D11 | P11 | UART1_TX | | | |
+D12 | P22 | | | | | TDI
+D13 | P20 | | I2C1_SCL | | | TCK
+A0 | P23, ADC3 | | | | |
+
+## Flash memory map
+
+Flash size: 2 MiB / 2,097,152 B / 0x200000
+
+Hex values are in bytes.
+
+Name | Start | Length | End
+----------------|----------|--------------------|---------
+Bootloader | 0x000000 | 68 KiB / 0x11000 | 0x011000
+App Image | 0x011000 | 1.1 MiB / 0x119000 | 0x12A000
+OTA Image | 0x12A000 | 664 KiB / 0xA6000 | 0x1D0000
+TLV Store | 0x1D0000 | 4 KiB / 0x1000 | 0x1D1000
+Network Data | 0x1D1000 | 8 KiB / 0x2000 | 0x1D3000
+Key-Value Store | 0x1D3000 | 32 KiB / 0x8000 | 0x1DB000
+User Data | 0x1DB000 | 148 KiB / 0x25000 | 0x200000
+
+Bootloader and app partitions contain CRC16 sums every 32 bytes. That results in the actual flash offsets/sizes not aligned to sector boundaries. To simplify calculations, the values shown in the table (extracted from bootloader's partition table) were aligned to 4096 bytes.
diff --git a/boards/cb3s/pinout_cb3s.svg b/boards/cb3s/pinout_cb3s.svg
new file mode 100644
index 0000000..a35a0eb
--- /dev/null
+++ b/boards/cb3s/pinout_cb3s.svg
@@ -0,0 +1,375 @@
+
+
diff --git a/boards/cb3s/pins_arduino.h b/boards/cb3s/pins_arduino.h
new file mode 100644
index 0000000..1de3ade
--- /dev/null
+++ b/boards/cb3s/pins_arduino.h
@@ -0,0 +1 @@
+#include "variant.h"
diff --git a/boards/cb3s/variant.cpp b/boards/cb3s/variant.cpp
new file mode 100644
index 0000000..eb8b2d7
--- /dev/null
+++ b/boards/cb3s/variant.cpp
@@ -0,0 +1,40 @@
+/* This file was auto-generated from cb3s.json using boardgen */
+
+#include
+
+extern "C" {
+
+// clang-format off
+PinInfo pinTable[PINS_COUNT] = {
+ // D0: P23, ADC3, TDO, FSO
+ {GPIO23, PIN_GPIO | PIN_IRQ | PIN_ADC | PIN_JTAG, PIN_NONE, 0},
+ // D1: P14, SD_CLK, SCK
+ {GPIO14, PIN_GPIO | PIN_IRQ | PIN_SPI, PIN_NONE, 0},
+ // D2: P26, PWM5, IRDA
+ {GPIO26, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D3: P24, PWM4
+ {GPIO24, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D4: P6, PWM0
+ {GPIO6, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D5: P9, PWM3
+ {GPIO9, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D6: P0, UART2_TX, I2C2_SCL
+ {GPIO0, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_UART, PIN_NONE, 0},
+ // D7: P21, I2C1_SDA, TMS, MCLK, ^FCS
+ {GPIO21, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_I2S | PIN_JTAG, PIN_NONE, 0},
+ // D8: P8, PWM2
+ {GPIO8, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D9: P7, PWM1
+ {GPIO7, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D10: P10, UART1_RX
+ {GPIO10, PIN_GPIO | PIN_IRQ | PIN_UART, PIN_NONE, 0},
+ // D11: P11, UART1_TX
+ {GPIO11, PIN_GPIO | PIN_IRQ | PIN_UART, PIN_NONE, 0},
+ // D12: P22, TDI, FSI
+ {GPIO22, PIN_GPIO | PIN_IRQ | PIN_JTAG, PIN_NONE, 0},
+ // D13: P20, I2C1_SCL, TCK, FSCK
+ {GPIO20, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_JTAG, PIN_NONE, 0},
+};
+// clang-format on
+
+} // extern "C"
diff --git a/boards/cb3s/variant.h b/boards/cb3s/variant.h
new file mode 100644
index 0000000..496702d
--- /dev/null
+++ b/boards/cb3s/variant.h
@@ -0,0 +1,38 @@
+/* This file was auto-generated from cb3s.json using boardgen */
+
+#pragma once
+
+#include
+
+// clang-format off
+
+// Pins
+// ----
+#define PINS_COUNT 14
+#define NUM_DIGITAL_PINS 14
+#define NUM_ANALOG_INPUTS 1
+#define NUM_ANALOG_OUTPUTS 0
+
+// Analog pins
+// -----------
+#define PIN_A0 0u // GPIO23
+#define PIN_A0 0u // GPIO23
+#define A0 PIN_A0
+#define A0 PIN_A0
+
+// SPI Interfaces
+// --------------
+#define SPI_INTERFACES_COUNT 0
+
+// Wire Interfaces
+// ---------------
+#define WIRE_INTERFACES_COUNT 1
+#define PIN_WIRE1_SCL 13u // GPIO20
+#define PIN_WIRE1_SDA_0 7u // GPIO21
+#define PIN_WIRE1_SDA_1 7u // GPIO21
+
+// Serial ports
+// ------------
+#define SERIAL_INTERFACES_COUNT 1
+#define PIN_SERIAL1_RX 10u // GPIO10
+#define PIN_SERIAL1_TX 11u // GPIO11
diff --git a/boards/cb3se.json b/boards/cb3se.json
new file mode 100644
index 0000000..b9af5ea
--- /dev/null
+++ b/boards/cb3se.json
@@ -0,0 +1,19 @@
+{
+ "_base": [
+ "beken-72xx",
+ "beken-7231n",
+ "beken-7231n-tuya",
+ "pcb/ic-bk7231-qfn32",
+ "pcb/cb3se"
+ ],
+ "build": {
+ "mcu": "bk7231n",
+ "variant": "cb3se"
+ },
+ "name": "CB3SE Wi-Fi Module",
+ "url": "https://developer.tuya.com/en/docs/iot/CB3SE-Module-Datasheet?id=Kanoiluul7nl2",
+ "vendor": "Tuya Inc.",
+ "pcb": {
+ "symbol": "CB3SE"
+ }
+}
diff --git a/boards/cb3se/README.md b/boards/cb3se/README.md
new file mode 100644
index 0000000..b33dd14
--- /dev/null
+++ b/boards/cb3se/README.md
@@ -0,0 +1,81 @@
+# CB3SE Wi-Fi Module
+
+*by Tuya Inc.*
+
+[Product page](https://developer.tuya.com/en/docs/iot/CB3SE-Module-Datasheet?id=Kanoiluul7nl2)
+
+- [General info](../../docs/platform/beken-72xx/README.md)
+- [Flashing guide](../../docs/platform/beken-72xx/flashing.md)
+- [BkWriter v1.6.0](https://images.tuyacn.com/smart/bk_writer1.60/bk_writer1.60.exe)
+
+Parameter | Value
+-------------|----------------------------------
+Board code | `cb3se`
+MCU | BK7231N
+Manufacturer | Beken
+Series | BK72XX
+Frequency | 120 MHz
+Flash size | 2 MiB
+RAM size | 256 KiB
+Voltage | 3.0V - 3.6V
+I/O | 17x GPIO, 6x PWM, 2x UART, 1x ADC
+Wi-Fi | 802.11 b/g/n
+Bluetooth | BLE v5.1
+
+## Usage
+
+**Board code:** `cb3se`
+
+In `platformio.ini`:
+
+```ini
+[env:cb3se]
+platform = libretuya
+board = cb3se
+framework = arduino
+```
+
+## Pinout
+
+
+
+## Arduino Core pin mapping
+
+No. | Pin | UART | I²C | SPI | PWM | Other
+----|-----------|----------|----------|------|------|------
+D0 | P23 | | | | | TDO
+D1 | P14 | | | SCK | |
+D2 | P26 | | | | PWM5 |
+D3 | P24 | | | | PWM4 |
+D4 | P6 | | | | PWM0 |
+D5 | P9 | | | | PWM3 |
+D6 | P0 | UART2_TX | I2C2_SCL | | |
+D7 | P1 | UART2_RX | I2C2_SDA | | |
+D8 | P8 | | | | PWM2 |
+D9 | P7 | | | | PWM1 |
+D10 | P10 | UART1_RX | | | |
+D11 | P11 | UART1_TX | | | |
+D12 | P15 | | | CS | |
+D13 | P22 | | | | | TDI
+D14 | P20 | | I2C1_SCL | | | TCK
+D15 | P17 | | | MISO | |
+D16 | P16 | | | MOSI | |
+A0 | P23, ADC3 | | | | |
+
+## Flash memory map
+
+Flash size: 2 MiB / 2,097,152 B / 0x200000
+
+Hex values are in bytes.
+
+Name | Start | Length | End
+----------------|----------|--------------------|---------
+Bootloader | 0x000000 | 68 KiB / 0x11000 | 0x011000
+App Image | 0x011000 | 1.1 MiB / 0x119000 | 0x12A000
+OTA Image | 0x12A000 | 664 KiB / 0xA6000 | 0x1D0000
+TLV Store | 0x1D0000 | 4 KiB / 0x1000 | 0x1D1000
+Network Data | 0x1D1000 | 8 KiB / 0x2000 | 0x1D3000
+Key-Value Store | 0x1D3000 | 32 KiB / 0x8000 | 0x1DB000
+User Data | 0x1DB000 | 148 KiB / 0x25000 | 0x200000
+
+Bootloader and app partitions contain CRC16 sums every 32 bytes. That results in the actual flash offsets/sizes not aligned to sector boundaries. To simplify calculations, the values shown in the table (extracted from bootloader's partition table) were aligned to 4096 bytes.
diff --git a/boards/cb3se/pinout_cb3se.svg b/boards/cb3se/pinout_cb3se.svg
new file mode 100644
index 0000000..4b9e01a
--- /dev/null
+++ b/boards/cb3se/pinout_cb3se.svg
@@ -0,0 +1,345 @@
+
+
diff --git a/boards/cb3se/pins_arduino.h b/boards/cb3se/pins_arduino.h
new file mode 100644
index 0000000..1de3ade
--- /dev/null
+++ b/boards/cb3se/pins_arduino.h
@@ -0,0 +1 @@
+#include "variant.h"
diff --git a/boards/cb3se/variant.cpp b/boards/cb3se/variant.cpp
new file mode 100644
index 0000000..55d77a9
--- /dev/null
+++ b/boards/cb3se/variant.cpp
@@ -0,0 +1,46 @@
+/* This file was auto-generated from cb3se.json using boardgen */
+
+#include
+
+extern "C" {
+
+// clang-format off
+PinInfo pinTable[PINS_COUNT] = {
+ // D0: P23, ADC3, TDO, FSO
+ {GPIO23, PIN_GPIO | PIN_IRQ | PIN_ADC | PIN_JTAG, PIN_NONE, 0},
+ // D1: P14, SD_CLK, SCK
+ {GPIO14, PIN_GPIO | PIN_IRQ | PIN_SPI, PIN_NONE, 0},
+ // D2: P26, PWM5, IRDA
+ {GPIO26, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D3: P24, PWM4
+ {GPIO24, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D4: P6, PWM0
+ {GPIO6, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D5: P9, PWM3
+ {GPIO9, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D6: P0, UART2_TX, I2C2_SCL
+ {GPIO0, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_UART, PIN_NONE, 0},
+ // D7: P1, UART2_RX, I2C2_SDA
+ {GPIO1, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_UART, PIN_NONE, 0},
+ // D8: P8, PWM2
+ {GPIO8, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D9: P7, PWM1
+ {GPIO7, PIN_GPIO | PIN_IRQ | PIN_PWM, PIN_NONE, 0},
+ // D10: P10, UART1_RX
+ {GPIO10, PIN_GPIO | PIN_IRQ | PIN_UART, PIN_NONE, 0},
+ // D11: P11, UART1_TX
+ {GPIO11, PIN_GPIO | PIN_IRQ | PIN_UART, PIN_NONE, 0},
+ // D12: P15, SD_CMD, CS
+ {GPIO15, PIN_GPIO | PIN_IRQ | PIN_SPI, PIN_NONE, 0},
+ // D13: P22, TDI, FSI
+ {GPIO22, PIN_GPIO | PIN_IRQ | PIN_JTAG, PIN_NONE, 0},
+ // D14: P20, I2C1_SCL, TCK, FSCK
+ {GPIO20, PIN_GPIO | PIN_IRQ | PIN_I2C | PIN_JTAG, PIN_NONE, 0},
+ // D15: P17, SD_D1, MISO
+ {GPIO17, PIN_GPIO | PIN_IRQ | PIN_SPI, PIN_NONE, 0},
+ // D16: P16, SD_D0, MOSI
+ {GPIO16, PIN_GPIO | PIN_IRQ | PIN_SPI, PIN_NONE, 0},
+};
+// clang-format on
+
+} // extern "C"
diff --git a/boards/cb3se/variant.h b/boards/cb3se/variant.h
new file mode 100644
index 0000000..9c5cd0c
--- /dev/null
+++ b/boards/cb3se/variant.h
@@ -0,0 +1,37 @@
+/* This file was auto-generated from cb3se.json using boardgen */
+
+#pragma once
+
+#include
+
+// clang-format off
+
+// Pins
+// ----
+#define PINS_COUNT 17
+#define NUM_DIGITAL_PINS 17
+#define NUM_ANALOG_INPUTS 1
+#define NUM_ANALOG_OUTPUTS 0
+
+// Analog pins
+// -----------
+#define PIN_A0 0u // GPIO23
+#define A0 PIN_A0
+
+// SPI Interfaces
+// --------------
+#define SPI_INTERFACES_COUNT 0
+
+// Wire Interfaces
+// ---------------
+#define WIRE_INTERFACES_COUNT 1
+#define PIN_WIRE2_SCL 6u // GPIO0
+#define PIN_WIRE2_SDA 7u // GPIO1
+
+// Serial ports
+// ------------
+#define SERIAL_INTERFACES_COUNT 2
+#define PIN_SERIAL1_RX 10u // GPIO10
+#define PIN_SERIAL1_TX 11u // GPIO11
+#define PIN_SERIAL2_RX 7u // GPIO1
+#define PIN_SERIAL2_TX 6u // GPIO0
diff --git a/docs/status/supported_boards.md b/docs/status/supported_boards.md
index b890e5e..f53bfa3 100644
--- a/docs/status/supported_boards.md
+++ b/docs/status/supported_boards.md
@@ -13,6 +13,9 @@ Name | MCU
[BW15](../../boards/bw15/README.md) | RTL8720CF | 2 MiB | 256 KiB | 16 (13 I/O) | ✔️ | ✔️ | ❌ | `realtek-ambz2`
**Tuya Inc.** | | | | | | | |
[CB2S](../../boards/cb2s/README.md) | BK7231N | 2 MiB | 256 KiB | 11 (8 I/O) | ✔️ | ✔️ | ❌ | `beken-7231n`
+[CB3L](../../boards/cb3l/README.md) | BK7231N | 2 MiB | 256 KiB | 16 (12 I/O) | ✔️ | ✔️ | ❌ | `beken-7231n`
+[CB3S](../../boards/cb3s/README.md) | BK7231N | 2 MiB | 256 KiB | 22 (16 I/O) | ✔️ | ✔️ | ❌ | `beken-7231n`
+[CB3SE](../../boards/cb3se/README.md) | BK7231N | 2 MiB | 256 KiB | 22 (17 I/O) | ✔️ | ✔️ | ❌ | `beken-7231n`
[WB2L](../../boards/wb2l/README.md) | BK7231T | 2 MiB | 256 KiB | 7 (5 I/O) | ✔️ | ✔️ | ❌ | `beken-7231t`
[WB2S](../../boards/wb2s/README.md) | BK7231T | 2 MiB | 256 KiB | 11 (8 I/O) | ✔️ | ✔️ | ❌ | `beken-7231t`
[WB3L](../../boards/wb3l/README.md) | BK7231T | 2 MiB | 256 KiB | 21 (17 I/O) | ✔️ | ✔️ | ❌ | `beken-7231t`
diff --git a/docs/status/unsupported_boards_tuya_all.md b/docs/status/unsupported_boards_tuya_all.md
index e083905..261b186 100644
--- a/docs/status/unsupported_boards_tuya_all.md
+++ b/docs/status/unsupported_boards_tuya_all.md
@@ -10,9 +10,6 @@ AXYU | ECR6600 | 2 MiB | 512 KiB | 21 | ✔️ | ✔️ | ❌
**CB Series** | | | | | | |
CB1S | BK7231N | 2 MiB | 256 KiB | 18 | ✔️ | ✔️ | ❌
CB2L | BK7231N | 2 MiB | 256 KiB | 7 | ✔️ | ✔️ | ❌
-CB3L | BK7231N | 2 MiB | 256 KiB | 18 | ✔️ | ✔️ | ❌
-CB3S | BK7231N | 2 MiB | 256 KiB | 22 | ✔️ | ✔️ | ❌
-CB3SE | BK7231N | 2 MiB | 256 KiB | 22 | ✔️ | ✔️ | ❌
CB8P | BK7231N | 2 MiB | 256 KiB | 10 | ✔️ | ✔️ | ❌
CBLC5 | BK7231N | 2 MiB | 256 KiB | 15 | ✔️ | ✔️ | ❌
CBLC9 | BK7231N | 2 MiB | 256 KiB | 8 | ✔️ | ✔️ | ❌