Compare commits

..

24 Commits

Author SHA1 Message Date
Thomas Göttgens
395db3a81e Merge branch 'master' into usbhost 2025-07-13 18:13:21 +02:00
Thomas Göttgens
c91030362c Merge branch 'master' into usbhost 2025-06-25 19:29:04 +02:00
Thomas Göttgens
44be39cef3 Merge branch 'master' into usbhost 2025-06-05 14:28:02 +02:00
Thomas Göttgens
b4cb6f2eb2 Merge branch 'master' into usbhost 2025-04-07 09:19:31 +02:00
Thomas Göttgens
311899e356 Merge branch 'master' into usbhost 2025-03-31 11:36:34 +02:00
Thomas Göttgens
5768d73c12 Merge branch 'master' into usbhost 2025-03-02 12:00:06 +01:00
Thomas Göttgens
d49ca18736 Merge branch 'master' into usbhost 2025-02-19 14:27:37 +01:00
Thomas Göttgens
f5b9343132 Merge branch 'master' into usbhost 2025-02-19 13:22:24 +01:00
Thomas Göttgens
c58a80377f Merge branch 'master' into usbhost 2025-01-18 14:11:30 +01:00
Thomas Göttgens
1158fa46f1 Merge branch 'master' into usbhost 2024-12-29 22:31:25 +01:00
Thomas Göttgens
8cc56ea2af Merge branch 'master' into usbhost 2024-11-24 15:51:03 +01:00
Thomas Göttgens
c4644936bb Merge branch 'master' into usbhost 2024-11-02 16:44:29 +01:00
Thomas Göttgens
b40ad76261 Merge branch 'master' into usbhost 2024-10-26 12:24:34 +02:00
Thomas Göttgens
f3344bf72d Merge branch 'master' into usbhost 2024-10-16 12:41:14 +02:00
Thomas Göttgens
bb921be19d Merge branch 'master' into usbhost 2024-10-08 14:13:28 +02:00
Thomas Göttgens
0c4f331002 Merge branch 'master' into usbhost 2024-09-04 14:45:21 +02:00
Thomas Göttgens
a84c69f171 Merge branch 'master' into usbhost 2024-07-23 19:48:20 +02:00
Thomas Göttgens
9b940e9f50 Merge branch 'master' into usbhost 2024-06-16 11:54:59 +02:00
Thomas Göttgens
fe7738d361 Merge branch 'master' into usbhost 2024-05-12 16:36:22 +02:00
Thomas Göttgens
5131e2b1e5 ESP32-C3 is not supported for USBHOST 2024-05-11 19:26:06 +02:00
Thomas Göttgens
477fa85318 fix compilation 2024-05-11 18:55:23 +02:00
Thomas Göttgens
dd98a07aa0 Merge branch 'master' into usbhost 2024-05-11 16:18:42 +02:00
Thomas Göttgens
4558f70769 Merge branch 'master' into usbhost 2024-04-23 13:04:41 +02:00
Thomas Göttgens
15790fff73 USB Host support stub. Doesn't work. 2024-02-23 11:13:33 +01:00
25 changed files with 145 additions and 169 deletions

View File

@@ -17,3 +17,6 @@ lib_ignore =
${esp32_base.lib_ignore}
NimBLE-Arduino
libpax
lib_deps = ${esp32_base.lib_deps}
tanakamasayuki/EspUsbHost@^1.0.2

View File

@@ -3,3 +3,6 @@ extends = esp32_base
custom_esp32_kind = esp32s3
monitor_speed = 115200
lib_deps = ${esp32_base.lib_deps}
tanakamasayuki/EspUsbHost@^1.0.2

View File

@@ -31,8 +31,9 @@ build_flags =
-fmerge-all-constants
-ffunction-sections
-fdata-sections
build_src_filter =
${arduino_base.build_src_filter} -<platform/esp32/> -<nimble/> -<mesh/api/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mesh/eth/> -<input> -<buzz> -<modules/RemoteHardwareModule.cpp> -<platform/nrf52> -<platform/portduino> -<platform/rp2xx0> -<mesh/raspihttp> -<.pio/*/*/I2CKeyPad/*>
${arduino_base.build_src_filter} -<platform/esp32/> -<nimble/> -<mesh/api/> -<mesh/wifi/> -<mesh/http/> -<modules/esp32> -<mesh/eth/> -<input> -<buzz> -<modules/RemoteHardwareModule.cpp> -<platform/nrf52> -<platform/portduino> -<platform/rp2xx0> -<mesh/raspihttp>
board_upload.offset_address = 0x08000000
upload_protocol = stlink
@@ -46,5 +47,4 @@ lib_deps =
https://github.com/caveman99/Crypto/archive/eae9c768054118a9399690f8af202853d1ae8516.zip
lib_ignore =
I2CKeyPad
OneButton

View File

@@ -72,7 +72,6 @@ lib_deps =
nanopb/Nanopb@0.4.91
# renovate: datasource=custom.pio depName=ErriezCRC32 packageName=erriez/library/ErriezCRC32
erriez/ErriezCRC32@1.0.1
robtillaart/I2CKeyPad@0.5.0
; Used for the code analysis in PIO Home / Inspect
check_tool = cppcheck

View File

@@ -150,12 +150,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Define if screen should be mirrored left to right
// #define SCREEN_MIRROR
// I2C Keyboards (M5Stack, RAK14004, T-Deck, PCF8574A passive)
// I2C Keyboards (M5Stack, RAK14004, T-Deck)
#define CARDKB_ADDR 0x5F
#define TDECK_KB_ADDR 0x55
#define BBQ10_KB_ADDR 0x1F
#define MPR121_KB_ADDR 0x5A
#define PCF8574A_ADDRESS 0x20
// -----------------------------------------------------------------------------
// SENSOR

View File

@@ -31,8 +31,8 @@ ScanI2C::FoundDevice ScanI2C::firstRTC() const
ScanI2C::FoundDevice ScanI2C::firstKeyboard() const
{
ScanI2C::DeviceType types[] = {CARDKB, TDECKKB, BBQ10KB, RAK14004, PCF8574A, MPR121KB, TCA8418KB};
return firstOfOrNONE(7, types);
ScanI2C::DeviceType types[] = {CARDKB, TDECKKB, BBQ10KB, RAK14004, MPR121KB, TCA8418KB};
return firstOfOrNONE(6, types);
}
ScanI2C::FoundDevice ScanI2C::firstAccelerometer() const

View File

@@ -18,7 +18,6 @@ class ScanI2C
TDECKKB,
BBQ10KB,
RAK14004,
PCF8574A,
PMU_AXP192_AXP2101, // has the same adress as the TCA8418KB
BME_680,
BME_280,

View File

@@ -210,9 +210,6 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(BBQ10_KB_ADDR, BBQ10KB, "BB Q10", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(ST7567_ADDRESS, SCREEN_ST7567, "ST7567", (uint8_t)addr.address);
#ifndef HAS_TCA9535
SCAN_SIMPLE_CASE(PCF8574A_ADDRESS, PCF8574A, "PCF8574A", (uint8_t)addr.address);
#endif
#ifdef HAS_NCP5623
SCAN_SIMPLE_CASE(NCP5623_ADDR, NCP5623, "NCP5623", (uint8_t)addr.address);
#endif

View File

@@ -9,10 +9,6 @@ CardKbI2cImpl::CardKbI2cImpl() : KbI2cBase("cardKB") {}
void CardKbI2cImpl::init()
{
if (kb_model == 0x12) {
disable();
return;
}
#if !MESHTASTIC_EXCLUDE_I2C && !defined(ARCH_PORTDUINO) && !defined(I2C_NO_RESCAN)
if (cardkb_found.address == 0x00) {
LOG_DEBUG("Rescan for I2C keyboard");

72
src/input/kbUsbBase.cpp Normal file
View File

@@ -0,0 +1,72 @@
#include "kbUsbBase.h"
#include "configuration.h"
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32S2
KbUsbBase::KbUsbBase(const char *name) : concurrency::OSThread(name)
{
this->_originName = name;
}
int32_t KbUsbBase::runOnce()
{
if (firstTime) {
// This is the first time the OSThread library has called this function, so init the USB HID routines
begin();
firstTime = 0;
} else {
task();
}
return 100;
}
void KbUsbBase::onKeyboardKey(uint8_t ascii, uint8_t keycode, uint8_t modifier)
{
if (ascii != 0) {
LOG_DEBUG("Key 0x%x Code 0x%x Mod 0x%x pressed\n", ascii, keycode, modifier);
// reset shift now that we have a keypress
InputEvent e;
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
e.source = this->_originName;
switch (ascii) {
case 0x1b: // ESC
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_CANCEL;
break;
case 0x08: // Back
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_BACK;
e.kbchar = ascii;
break;
case 0xb5: // Up
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_UP;
break;
case 0xb6: // Down
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_DOWN;
break;
case 0xb4: // Left
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_LEFT;
e.kbchar = ascii;
break;
case 0xb7: // Right
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT;
e.kbchar = ascii;
break;
case 0x0d: // Enter
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_SELECT;
break;
case 0x00: // nopress
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
break;
default: // all other keys
e.inputEvent = ANYKEY;
e.kbchar = ascii;
break;
}
if (e.inputEvent != meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE) {
this->notifyObservers(&e);
}
}
}
#endif

21
src/input/kbUsbBase.h Normal file
View File

@@ -0,0 +1,21 @@
#pragma once
#include "InputBroker.h"
#include "concurrency/OSThread.h"
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32S2
#include "EspUsbHost.h"
class KbUsbBase : public Observable<const InputEvent *>, public concurrency::OSThread, public EspUsbHost
{
public:
explicit KbUsbBase(const char *name);
protected:
virtual int32_t runOnce() override;
private:
void onKeyboardKey(uint8_t ascii, uint8_t keycode, uint8_t modifier);
const char *_originName;
bool firstTime = 1;
};
#endif

15
src/input/kbUsbImpl.cpp Normal file
View File

@@ -0,0 +1,15 @@
#include "kbUsbImpl.h"
#include "InputBroker.h"
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32S2
KbUsbImpl *kbUsbImpl;
KbUsbImpl::KbUsbImpl() : KbUsbBase("usbKB") {}
void KbUsbImpl::init()
{
inputBroker->registerSource(this);
}
#endif // INPUTBROKER_MATRIX_TYPE

View File

@@ -1,6 +1,8 @@
#pragma once
#include "kbUsbBase.h"
#include "main.h"
#include "peMatrixBase.h"
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32S2
/**
* @brief The idea behind this class to have static methods for the event handlers.
@@ -9,11 +11,13 @@
* to your device as you wish, but you always need to have separate event
* handlers, thus you need to have a RotaryEncoderInterrupt implementation.
*/
class PeMatrixImpl : public PeMatrixBase
class KbUsbImpl : public KbUsbBase
{
public:
PeMatrixImpl();
KbUsbImpl();
void init();
};
extern PeMatrixImpl *peMatrixImpl;
extern KbUsbImpl *kbUsbImpl;
#endif

View File

@@ -1,88 +0,0 @@
#include "peMatrixBase.h"
#include "configuration.h"
#include "detect/ScanI2C.h"
extern ScanI2C::DeviceAddress cardkb_found;
extern uint8_t kb_model;
#if WIRE_INTERFACES_COUNT == 2 // defined in architecture.h
I2CKeyPad keyPad(cardkb_found.address, cardkb_found.port == ScanI2C::WIRE1 ? &Wire1 : &Wire);
#else
I2CKeyPad keyPad(cardkb_found.address, &Wire);
#endif
PeMatrixBase::PeMatrixBase(const char *name) : concurrency::OSThread(name)
{
this->_originName = name;
}
int32_t PeMatrixBase::runOnce()
{
if (kb_model != 0x12) {
// Input device is not detected.
return disable();
}
if (firstTime) {
// This is the first time the OSThread library has called this function, so do port setup
firstTime = 0;
if (!keyPad.begin()) {
LOG_ERROR("Failed to initialize I2C keypad");
return disable();
}
keyPad.loadKeyMap(keymap);
} else {
if (keyPad.isPressed()) {
key = keyPad.getChar();
// debounce
if (key != prevkey) {
if (key != 0) {
LOG_DEBUG("Key 0x%x pressed\n", key);
// reset shift now that we have a keypress
InputEvent e;
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
e.source = this->_originName;
switch (key) {
case 0x1b: // ESC
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_CANCEL;
break;
case 0x08: // Back
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_BACK;
e.kbchar = key;
break;
case 0xb5: // Up
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_UP;
break;
case 0xb6: // Down
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_DOWN;
break;
case 0xb4: // Left
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_LEFT;
e.kbchar = key;
break;
case 0xb7: // Right
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT;
e.kbchar = key;
break;
case 0x0d: // Enter
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_SELECT;
break;
case 0x00: // nopress
e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
break;
default: // all other keys
e.inputEvent = ANYKEY;
e.kbchar = key;
break;
}
if (e.inputEvent != meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE) {
this->notifyObservers(&e);
}
}
prevkey = key;
}
}
}
return 100; // Keyscan every 100msec to avoid key bounce
}

View File

@@ -1,22 +0,0 @@
#pragma once
#include "InputBroker.h"
#include "concurrency/OSThread.h"
#include <I2CKeyPad.h>
class PeMatrixBase : public Observable<const InputEvent *>, public concurrency::OSThread
{
public:
explicit PeMatrixBase(const char *name);
protected:
virtual int32_t runOnce() override;
private:
const char *_originName;
bool firstTime = 1;
// char keymap[19] = "123A456B789C*0#DNF"; // N = NoKey, F = Fail
char keymap[19] = {0x1b, 0xb5, '3', 'A', 0xb4, 0x0d, 0xb7, 'B', '7', 0xb6, '9', 'C', 0x09, '0', 0x08, 'D', 'N', 'F'};
char key = 0;
char prevkey = 0;
};

View File

@@ -1,16 +0,0 @@
#include "peMatrixImpl.h"
#include "InputBroker.h"
PeMatrixImpl *peMatrixImpl;
PeMatrixImpl::PeMatrixImpl() : PeMatrixBase("matrixPE") {}
void PeMatrixImpl::init()
{
if (kb_model != 0x12) {
disable();
return;
}
inputBroker->registerSource(this);
}

View File

@@ -607,9 +607,6 @@ void setup()
// assign an arbitrary value to distinguish from other models
kb_model = 0x11;
break;
case ScanI2C::DeviceType::PCF8574A:
kb_model = 0x12;
break;
case ScanI2C::DeviceType::MPR121KB:
// assign an arbitrary value to distinguish from other models
kb_model = 0x37;

View File

@@ -12,7 +12,7 @@
#include "input/cardKbI2cImpl.h"
#endif
#include "input/kbMatrixImpl.h"
#include "input/peMatrixImpl.h"
#include "input/kbUsbImpl.h"
#endif
#if !MESHTASTIC_EXCLUDE_PKI
#include "KeyVerificationModule.h"
@@ -182,14 +182,14 @@ void setupModules()
kbMatrixImpl = new KbMatrixImpl();
kbMatrixImpl->init();
#endif // INPUTBROKER_MATRIX_TYPE
peMatrixImpl = new PeMatrixImpl();
peMatrixImpl->init();
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32S2
kbUsbImpl = new KbUsbImpl();
kbUsbImpl->init();
#endif
#ifdef INPUTBROKER_SERIAL_TYPE
aSerialKeyboardImpl = new SerialKeyboardImpl();
aSerialKeyboardImpl->init();
#endif // INPUTBROKER_MATRIX_TYPE
#endif // INPUTBROKER_SERIAL_TYPE
}
#endif // HAS_BUTTON
#if ARCH_PORTDUINO

View File

@@ -8,7 +8,7 @@ board_level = extra
upload_protocol = esptool
;upload_port = /dev/ttyACM2
lib_deps =
${esp32_base.lib_deps}
${esp32s3_base.lib_deps}
caveman99/ESP32 Codec2@^1.0.1
build_flags =
${esp32_base.build_flags} -D PRIVATE_HW -I variants/bpi_picow_esp32_s3
${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/bpi_picow_esp32_s3

View File

@@ -2,7 +2,7 @@
extends = esp32c3_base
board = esp32-c3-devkitm-1
build_flags =
${esp32_base.build_flags}
${esp32c3_base.build_flags}
-D HELTEC_HT62
-I variants/heltec_esp32c3
monitor_speed = 115200

View File

@@ -3,7 +3,7 @@ extends = esp32c3_base
board = esp32-c3-devkitm-1
board_level = extra
build_flags =
${esp32_base.build_flags}
${esp32c3_base.build_flags}
-D PRIVATE_HW
-I variants/m5stack-stamp-c3
monitor_speed = 115200

View File

@@ -11,15 +11,15 @@ upload_speed = 921600
platform_packages =
platformio/tool-esptoolpy@^1.40801.0
lib_deps =
${esp32_base.lib_deps}
${esp32s3_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
adafruit/Adafruit NeoPixel @ ^1.12.0
build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
;${esp32_base.build_flags} -D MY_ESP32S3_DIY -I variants/my_esp32s3_diy_eink
${esp32_base.build_flags} -D PRIVATE_HW -I variants/my_esp32s3_diy_eink
;${esp32s3_base.build_flags} -D MY_ESP32S3_DIY -I variants/my_esp32s3_diy_eink
${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/my_esp32s3_diy_eink
-Dmy
-DEINK_DISPLAY_MODEL=GxEPD2_290_T5D
-DEINK_WIDTH=296

View File

@@ -11,14 +11,14 @@ upload_speed = 921600
platform_packages =
platformio/tool-esptoolpy@^1.40801.0
lib_deps =
${esp32_base.lib_deps}
${esp32s3_base.lib_deps}
adafruit/Adafruit NeoPixel @ ^1.12.0
build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
;${esp32_base.build_flags} -D MY_ESP32S3_DIY -I variants/my_esp32s3_diy_oled
${esp32_base.build_flags} -D PRIVATE_HW -I variants/my_esp32s3_diy_oled
;${esp32s3_base.build_flags} -D MY_ESP32S3_DIY -I variants/my_esp32s3_diy_oled
${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/my_esp32s3_diy_oled
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
-DARDUINO_USB_MODE=0

View File

@@ -17,9 +17,6 @@
// #define ADC_CHANNEL ADC1_GPIO27_CHANNEL
// #define ADC_MULTIPLIER 2
// Portexpander
#define HAS_TCA9535
// ST7701 TFT LCD
#define ST7701_CS (4 | IO_EXPANDER)
#define ST7701_RS -1 // DC

View File

@@ -5,5 +5,5 @@ board_check = true
upload_protocol = esptool
build_flags =
${esp32_base.build_flags} -D TLORA_T3S3_V1 -I variants/tlora_t3s3_v1
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
${esp32s3_base.build_flags} -D TLORA_T3S3_V1 -I variants/tlora_t3s3_v1
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.