Skip to content

Commit d1eb62d

Browse files
facchinmpre-commit-ci-lite[bot]P-R-O-C-H-Y
authored
feat(board): add support for Arduino Nesso N1 (#11985)
* feat: add Arduino Nesso N1 Also implement an oveload for digital* operation to abstract the various gpio expanders. TODO: change WireInternal into default Wire (will require the user to explicitly include "Wire.h" (as in https://github.com/arduino/ArduinoCore-mbed/blob/main/variants/NANO_RP2040_CONNECT/nina_pins.h#L14-L18 ) * feat: nesso_n1: protect digital* calls from misuse * feat: nesso_n1: enable battery only charging for now * ci(pre-commit): Apply automatic fixes * fix: Spelling error --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com>
1 parent ff5866b commit d1eb62d

File tree

3 files changed

+352
-0
lines changed

3 files changed

+352
-0
lines changed

boards.txt

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52955,3 +52955,149 @@ soldered_nula_mini_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_
5295552955
soldered_nula_mini_esp32c6.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native
5295652956

5295752957
##############################################################
52958+
52959+
arduino_nesso_n1.name=Arduino Nesso N1
52960+
52961+
arduino_nesso_n1.bootloader.tool=esptool_py
52962+
arduino_nesso_n1.bootloader.tool.default=esptool_py
52963+
52964+
arduino_nesso_n1.upload.tool=esptool_py
52965+
arduino_nesso_n1.upload.tool.default=esptool_py
52966+
arduino_nesso_n1.upload.tool.network=esp_ota
52967+
52968+
arduino_nesso_n1.upload.maximum_size=1310720
52969+
arduino_nesso_n1.upload.maximum_data_size=327680
52970+
arduino_nesso_n1.upload.flags=
52971+
arduino_nesso_n1.upload.extra_flags=
52972+
arduino_nesso_n1.upload.use_1200bps_touch=false
52973+
arduino_nesso_n1.upload.wait_for_upload_port=false
52974+
52975+
arduino_nesso_n1.serial.disableDTR=false
52976+
arduino_nesso_n1.serial.disableRTS=false
52977+
52978+
arduino_nesso_n1.build.tarch=riscv32
52979+
arduino_nesso_n1.build.target=esp
52980+
arduino_nesso_n1.build.mcu=esp32c6
52981+
arduino_nesso_n1.build.core=esp32
52982+
arduino_nesso_n1.build.variant=arduino_nesso_n1
52983+
arduino_nesso_n1.build.board=ARDUINO_NESSO_N1
52984+
arduino_nesso_n1.build.bootloader_addr=0x0
52985+
52986+
arduino_nesso_n1.build.cdc_on_boot=1
52987+
arduino_nesso_n1.build.f_cpu=160000000L
52988+
arduino_nesso_n1.build.flash_size=16MB
52989+
arduino_nesso_n1.build.flash_freq=80m
52990+
arduino_nesso_n1.build.flash_mode=qio
52991+
arduino_nesso_n1.build.boot=qio
52992+
arduino_nesso_n1.build.partitions=default
52993+
arduino_nesso_n1.build.defines=
52994+
52995+
## IDE 2.0 Seems to not update the value
52996+
arduino_nesso_n1.menu.JTAGAdapter.default=Disabled
52997+
arduino_nesso_n1.menu.JTAGAdapter.default.build.copy_jtag_files=0
52998+
arduino_nesso_n1.menu.JTAGAdapter.builtin=Integrated USB JTAG
52999+
arduino_nesso_n1.menu.JTAGAdapter.builtin.build.openocdscript=esp32c6-builtin.cfg
53000+
arduino_nesso_n1.menu.JTAGAdapter.builtin.build.copy_jtag_files=1
53001+
arduino_nesso_n1.menu.JTAGAdapter.external=FTDI Adapter
53002+
arduino_nesso_n1.menu.JTAGAdapter.external.build.openocdscript=esp32c6-ftdi.cfg
53003+
arduino_nesso_n1.menu.JTAGAdapter.external.build.copy_jtag_files=1
53004+
arduino_nesso_n1.menu.JTAGAdapter.bridge=ESP USB Bridge
53005+
arduino_nesso_n1.menu.JTAGAdapter.bridge.build.openocdscript=esp32c6-bridge.cfg
53006+
arduino_nesso_n1.menu.JTAGAdapter.bridge.build.copy_jtag_files=1
53007+
53008+
arduino_nesso_n1.menu.CDCOnBoot.default=Enabled
53009+
arduino_nesso_n1.menu.CDCOnBoot.default.build.cdc_on_boot=1
53010+
arduino_nesso_n1.menu.CDCOnBoot.cdc=Disabled
53011+
arduino_nesso_n1.menu.CDCOnBoot.cdc.build.cdc_on_boot=0
53012+
53013+
arduino_nesso_n1.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS)
53014+
arduino_nesso_n1.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
53015+
arduino_nesso_n1.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
53016+
arduino_nesso_n1.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
53017+
arduino_nesso_n1.menu.PartitionScheme.default.build.partitions=default
53018+
arduino_nesso_n1.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS)
53019+
arduino_nesso_n1.menu.PartitionScheme.defaultffat.build.partitions=default_ffat
53020+
arduino_nesso_n1.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS)
53021+
arduino_nesso_n1.menu.PartitionScheme.no_ota.build.partitions=no_ota
53022+
arduino_nesso_n1.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
53023+
arduino_nesso_n1.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS)
53024+
arduino_nesso_n1.menu.PartitionScheme.noota_3g.build.partitions=noota_3g
53025+
arduino_nesso_n1.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576
53026+
arduino_nesso_n1.menu.PartitionScheme.noota_ffat=No OTA (2MB APP/2MB FATFS)
53027+
arduino_nesso_n1.menu.PartitionScheme.noota_ffat.build.partitions=noota_ffat
53028+
arduino_nesso_n1.menu.PartitionScheme.noota_ffat.upload.maximum_size=2097152
53029+
arduino_nesso_n1.menu.PartitionScheme.noota_3gffat=No OTA (1MB APP/3MB FATFS)
53030+
arduino_nesso_n1.menu.PartitionScheme.noota_3gffat.build.partitions=noota_3gffat
53031+
arduino_nesso_n1.menu.PartitionScheme.noota_3gffat.upload.maximum_size=1048576
53032+
arduino_nesso_n1.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS)
53033+
arduino_nesso_n1.menu.PartitionScheme.huge_app.build.partitions=huge_app
53034+
arduino_nesso_n1.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
53035+
arduino_nesso_n1.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs
53036+
arduino_nesso_n1.menu.PartitionScheme.zigbee.build.partitions=zigbee
53037+
arduino_nesso_n1.menu.PartitionScheme.zigbee.upload.maximum_size=1310720
53038+
arduino_nesso_n1.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs
53039+
arduino_nesso_n1.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr
53040+
arduino_nesso_n1.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720
53041+
53042+
arduino_nesso_n1.menu.CPUFreq.160=160MHz (WiFi)
53043+
arduino_nesso_n1.menu.CPUFreq.160.build.f_cpu=160000000L
53044+
arduino_nesso_n1.menu.CPUFreq.80=80MHz (WiFi)
53045+
arduino_nesso_n1.menu.CPUFreq.80.build.f_cpu=80000000L
53046+
arduino_nesso_n1.menu.CPUFreq.40=40MHz
53047+
arduino_nesso_n1.menu.CPUFreq.40.build.f_cpu=40000000L
53048+
arduino_nesso_n1.menu.CPUFreq.20=20MHz
53049+
arduino_nesso_n1.menu.CPUFreq.20.build.f_cpu=20000000L
53050+
arduino_nesso_n1.menu.CPUFreq.10=10MHz
53051+
arduino_nesso_n1.menu.CPUFreq.10.build.f_cpu=10000000L
53052+
53053+
arduino_nesso_n1.menu.FlashMode.qio=QIO
53054+
arduino_nesso_n1.menu.FlashMode.qio.build.flash_mode=dio
53055+
arduino_nesso_n1.menu.FlashMode.qio.build.boot=qio
53056+
arduino_nesso_n1.menu.FlashMode.dio=DIO
53057+
arduino_nesso_n1.menu.FlashMode.dio.build.flash_mode=dio
53058+
arduino_nesso_n1.menu.FlashMode.dio.build.boot=dio
53059+
53060+
arduino_nesso_n1.menu.UploadSpeed.921600=921600
53061+
arduino_nesso_n1.menu.UploadSpeed.921600.upload.speed=921600
53062+
arduino_nesso_n1.menu.UploadSpeed.115200=115200
53063+
arduino_nesso_n1.menu.UploadSpeed.115200.upload.speed=115200
53064+
arduino_nesso_n1.menu.UploadSpeed.256000.windows=256000
53065+
arduino_nesso_n1.menu.UploadSpeed.256000.upload.speed=256000
53066+
arduino_nesso_n1.menu.UploadSpeed.230400.windows.upload.speed=256000
53067+
arduino_nesso_n1.menu.UploadSpeed.230400=230400
53068+
arduino_nesso_n1.menu.UploadSpeed.230400.upload.speed=230400
53069+
arduino_nesso_n1.menu.UploadSpeed.460800.linux=460800
53070+
arduino_nesso_n1.menu.UploadSpeed.460800.macosx=460800
53071+
arduino_nesso_n1.menu.UploadSpeed.460800.upload.speed=460800
53072+
arduino_nesso_n1.menu.UploadSpeed.512000.windows=512000
53073+
arduino_nesso_n1.menu.UploadSpeed.512000.upload.speed=512000
53074+
53075+
arduino_nesso_n1.menu.DebugLevel.none=None
53076+
arduino_nesso_n1.menu.DebugLevel.none.build.code_debug=0
53077+
arduino_nesso_n1.menu.DebugLevel.error=Error
53078+
arduino_nesso_n1.menu.DebugLevel.error.build.code_debug=1
53079+
arduino_nesso_n1.menu.DebugLevel.warn=Warn
53080+
arduino_nesso_n1.menu.DebugLevel.warn.build.code_debug=2
53081+
arduino_nesso_n1.menu.DebugLevel.info=Info
53082+
arduino_nesso_n1.menu.DebugLevel.info.build.code_debug=3
53083+
arduino_nesso_n1.menu.DebugLevel.debug=Debug
53084+
arduino_nesso_n1.menu.DebugLevel.debug.build.code_debug=4
53085+
arduino_nesso_n1.menu.DebugLevel.verbose=Verbose
53086+
arduino_nesso_n1.menu.DebugLevel.verbose.build.code_debug=5
53087+
53088+
arduino_nesso_n1.menu.EraseFlash.none=Disabled
53089+
arduino_nesso_n1.menu.EraseFlash.none.upload.erase_cmd=
53090+
arduino_nesso_n1.menu.EraseFlash.all=Enabled
53091+
arduino_nesso_n1.menu.EraseFlash.all.upload.erase_cmd=-e
53092+
53093+
arduino_nesso_n1.menu.ZigbeeMode.default=Disabled
53094+
arduino_nesso_n1.menu.ZigbeeMode.default.build.zigbee_mode=
53095+
arduino_nesso_n1.menu.ZigbeeMode.default.build.zigbee_libs=
53096+
arduino_nesso_n1.menu.ZigbeeMode.ed=Zigbee ED (end device)
53097+
arduino_nesso_n1.menu.ZigbeeMode.ed.build.zigbee_mode=-DZIGBEE_MODE_ED
53098+
arduino_nesso_n1.menu.ZigbeeMode.ed.build.zigbee_libs=-lesp_zb_api.ed -lzboss_stack.ed -lzboss_port.native
53099+
arduino_nesso_n1.menu.ZigbeeMode.zczr=Zigbee ZCZR (coordinator/router)
53100+
arduino_nesso_n1.menu.ZigbeeMode.zczr.build.zigbee_mode=-DZIGBEE_MODE_ZCZR
53101+
arduino_nesso_n1.menu.ZigbeeMode.zczr.build.zigbee_libs=-lesp_zb_api.zczr -lzboss_stack.zczr -lzboss_port.native
53102+
53103+
##############################################################
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#define TwoWire TwoWireInternal
2+
#define Wire WireInternal
3+
#define Wire1 WireInternal1
4+
5+
#include "pins_arduino.h"
6+
#include "../../libraries/Wire/src/Wire.h"
7+
#include "../../libraries/Wire/src/Wire.cpp"
8+
9+
static bool wireInitialized = false;
10+
11+
// From https://www.diodes.com/datasheet/download/PI4IOE5V6408.pdf
12+
static void writeRegister(uint8_t address, uint8_t reg, uint8_t value) {
13+
WireInternal.beginTransmission(address);
14+
WireInternal.write(reg);
15+
WireInternal.write(value);
16+
WireInternal.endTransmission();
17+
}
18+
19+
static uint8_t readRegister(uint8_t address, uint8_t reg) {
20+
WireInternal.beginTransmission(address);
21+
WireInternal.write(reg);
22+
WireInternal.endTransmission(false);
23+
WireInternal.requestFrom(address, 1);
24+
return WireInternal.read();
25+
}
26+
27+
static void writeBitRegister(uint8_t address, uint8_t reg, uint8_t bit, uint8_t value) {
28+
uint8_t val = readRegister(address, reg);
29+
if (value) {
30+
writeRegister(address, reg, val | (1 << bit));
31+
} else {
32+
writeRegister(address, reg, val & ~(1 << bit));
33+
}
34+
}
35+
36+
static bool readBitRegister(uint8_t address, uint8_t reg, uint8_t bit) {
37+
uint8_t val = readRegister(address, reg);
38+
return ((val & (1 << bit)) > 0);
39+
}
40+
41+
void pinMode(ExpanderPin pin, uint8_t mode) {
42+
if (!wireInitialized) {
43+
WireInternal.begin(SDA, SCL);
44+
wireInitialized = true;
45+
// reset all registers to default state
46+
writeRegister(pin.address, 0x1, 0x1);
47+
// set all pins as high as default state
48+
writeRegister(pin.address, 0x9, 0xFF);
49+
// interrupt mask to all pins
50+
writeRegister(pin.address, 0x11, 0xFF);
51+
// all input
52+
writeRegister(pin.address, 0x3, 0);
53+
}
54+
writeBitRegister(pin.address, 0x3, pin.pin, mode == OUTPUT);
55+
if (mode == OUTPUT) {
56+
// remove high impedance
57+
writeBitRegister(pin.address, 0x7, pin.pin, false);
58+
} else if (mode == INPUT_PULLUP) {
59+
// set pull-up resistor
60+
writeBitRegister(pin.address, 0xB, pin.pin, true);
61+
writeBitRegister(pin.address, 0xD, pin.pin, true);
62+
} else if (mode == INPUT_PULLDOWN) {
63+
// disable pull-up resistor
64+
writeBitRegister(pin.address, 0xB, pin.pin, true);
65+
writeBitRegister(pin.address, 0xD, pin.pin, false);
66+
} else if (mode == INPUT) {
67+
// disable pull selector resistor
68+
writeBitRegister(pin.address, 0xB, pin.pin, false);
69+
}
70+
}
71+
72+
void digitalWrite(ExpanderPin pin, uint8_t val) {
73+
if (!wireInitialized) {
74+
WireInternal.begin(SDA, SCL);
75+
wireInitialized = true;
76+
}
77+
writeBitRegister(pin.address, 0x5, pin.pin, val == HIGH);
78+
}
79+
80+
int digitalRead(ExpanderPin pin) {
81+
if (!wireInitialized) {
82+
WireInternal.begin(SDA, SCL);
83+
wireInitialized = true;
84+
}
85+
return readBitRegister(pin.address, 0xF, pin.pin);
86+
}
87+
88+
void NessoBattery::enableCharge() {
89+
// AW32001E - address 0x49
90+
// set CEB bit low (charge enable)
91+
if (!wireInitialized) {
92+
WireInternal.begin(SDA, SCL);
93+
wireInitialized = true;
94+
}
95+
writeBitRegister(0x49, 0x1, 3, false);
96+
}
97+
98+
float NessoBattery::getVoltage() {
99+
// BQ27220 - address 0x55
100+
if (!wireInitialized) {
101+
WireInternal.begin(SDA, SCL);
102+
wireInitialized = true;
103+
}
104+
uint16_t voltage = (readRegister(0x55, 0x9) << 8) | readRegister(0x55, 0x8);
105+
return (float)voltage / 1000.0f;
106+
}
107+
108+
uint16_t NessoBattery::getChargeLevel() {
109+
// BQ27220 - address 0x55
110+
if (!wireInitialized) {
111+
WireInternal.begin(SDA, SCL);
112+
wireInitialized = true;
113+
}
114+
uint16_t current_capacity = readRegister(0x55, 0x11) << 8 | readRegister(0x55, 0x10);
115+
uint16_t total_capacity = readRegister(0x55, 0x13) << 8 | readRegister(0x55, 0x12);
116+
return (current_capacity * 100) / total_capacity;
117+
}
118+
119+
ExpanderPin LORA_LNA_ENABLE(5);
120+
ExpanderPin LORA_ANTENNA_SWITCH(6);
121+
ExpanderPin LORA_ENABLE(7);
122+
ExpanderPin KEY1(0);
123+
ExpanderPin KEY2(1);
124+
ExpanderPin POWEROFF((1 << 8) | 0);
125+
ExpanderPin LCD_RESET((1 << 8) | 1);
126+
ExpanderPin GROVE_POWER_EN((1 << 8) | 2);
127+
ExpanderPin VIN_DETECT((1 << 8) | 5);
128+
ExpanderPin LCD_BACKLIGHT((1 << 8) | 6);
129+
ExpanderPin LED_BUILTIN((1 << 8) | 7);
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#ifndef Pins_Arduino_h
2+
#define Pins_Arduino_h
3+
4+
#include <stdint.h>
5+
#include "soc/soc_caps.h"
6+
7+
#define USB_VID 0x303A
8+
#define USB_PID 0x1001
9+
#define USB_MANUFACTURER "Arduino"
10+
#define USB_PRODUCT "Nesso N1"
11+
#define USB_SERIAL ""
12+
13+
static const uint8_t TX = -1;
14+
static const uint8_t RX = -1;
15+
16+
static const uint8_t SDA = 10;
17+
static const uint8_t SCL = 8;
18+
19+
static const uint8_t MOSI = 21;
20+
static const uint8_t MISO = 22;
21+
static const uint8_t SCK = 20;
22+
static const uint8_t SS = 23;
23+
24+
static const uint8_t D1 = 7;
25+
static const uint8_t D2 = 2;
26+
static const uint8_t D3 = 6;
27+
28+
static const uint8_t IR_TX_PIN = 9;
29+
static const uint8_t BEEP_PIN = 11;
30+
31+
static const uint8_t GROVE_IO_0 = 5;
32+
static const uint8_t GROVE_IO_1 = 4;
33+
34+
static const uint8_t LORA_IRQ = 15;
35+
static const uint8_t LORA_CS = 23;
36+
static const uint8_t LORA_BUSY = 19;
37+
38+
static const uint8_t SYS_IRQ = 3;
39+
40+
static const uint8_t LCD_CS = 17;
41+
static const uint8_t LCD_RS = 16;
42+
43+
#if !defined(MAIN_ESP32_HAL_GPIO_H_) && defined(__cplusplus)
44+
/* address: 0x43/0x44 */
45+
class ExpanderPin {
46+
public:
47+
ExpanderPin(uint16_t _pin) : pin(_pin & 0xFF), address(_pin & 0x100 ? 0x44 : 0x43){};
48+
uint8_t pin;
49+
uint8_t address;
50+
};
51+
52+
class NessoBattery {
53+
public:
54+
NessoBattery(){};
55+
void enableCharge(); // enable charging
56+
float getVoltage(); // get battery voltage in Volts
57+
uint16_t getChargeLevel(); // get battery charge level in percents
58+
};
59+
60+
extern ExpanderPin LORA_LNA_ENABLE;
61+
extern ExpanderPin LORA_ANTENNA_SWITCH;
62+
extern ExpanderPin LORA_ENABLE;
63+
extern ExpanderPin POWEROFF;
64+
extern ExpanderPin GROVE_POWER_EN;
65+
extern ExpanderPin VIN_DETECT;
66+
extern ExpanderPin LCD_RESET;
67+
extern ExpanderPin LCD_BACKLIGHT;
68+
extern ExpanderPin LED_BUILTIN;
69+
extern ExpanderPin KEY1;
70+
extern ExpanderPin KEY2;
71+
72+
void pinMode(ExpanderPin pin, uint8_t mode);
73+
void digitalWrite(ExpanderPin pin, uint8_t val);
74+
int digitalRead(ExpanderPin pin);
75+
#endif
76+
77+
#endif /* Pins_Arduino_h */

0 commit comments

Comments
 (0)