Merge pull request #3933 from HarukiToreda/master

Boot issue fix of Cardkb on ESP32
pull/4109/head^2
Thomas Göttgens 2024-06-17 23:24:42 +02:00 zatwierdzone przez GitHub
commit 5fceab7f0f
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
7 zmienionych plików z 67 dodań i 15 usunięć

Wyświetl plik

@ -6,6 +6,7 @@ const ScanI2C::FoundDevice ScanI2C::DEVICE_NONE = ScanI2C::FoundDevice(ScanI2C::
ScanI2C::ScanI2C() = default; ScanI2C::ScanI2C() = default;
void ScanI2C::scanPort(ScanI2C::I2CPort port) {} void ScanI2C::scanPort(ScanI2C::I2CPort port) {}
void ScanI2C::scanPort(ScanI2C::I2CPort port, uint8_t *address, uint8_t asize) {}
void ScanI2C::setSuppressScreen() void ScanI2C::setSuppressScreen()
{ {

Wyświetl plik

@ -88,6 +88,7 @@ class ScanI2C
ScanI2C(); ScanI2C();
virtual void scanPort(ScanI2C::I2CPort); virtual void scanPort(ScanI2C::I2CPort);
virtual void scanPort(ScanI2C::I2CPort, uint8_t *, uint8_t);
/* /*
* A bit of a hack, this tells the scanner not to tell later systems there is a screen to avoid enabling it. * A bit of a hack, this tells the scanner not to tell later systems there is a screen to avoid enabling it.

Wyświetl plik

@ -14,6 +14,15 @@
#define XPOWERS_AXP192_AXP2101_ADDRESS 0x34 #define XPOWERS_AXP192_AXP2101_ADDRESS 0x34
#endif #endif
bool in_array(uint8_t *array, int size, uint8_t lookfor)
{
int i;
for (i = 0; i < size; i++)
if (lookfor == array[i])
return true;
return false;
}
ScanI2C::FoundDevice ScanI2CTwoWire::find(ScanI2C::DeviceType type) const ScanI2C::FoundDevice ScanI2CTwoWire::find(ScanI2C::DeviceType type) const
{ {
concurrency::LockGuard guard((concurrency::Lock *)&lock); concurrency::LockGuard guard((concurrency::Lock *)&lock);
@ -135,11 +144,11 @@ uint16_t ScanI2CTwoWire::getRegisterValue(const ScanI2CTwoWire::RegisterLocation
type = T; \ type = T; \
break; break;
void ScanI2CTwoWire::scanPort(I2CPort port) void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
{ {
concurrency::LockGuard guard((concurrency::Lock *)&lock); concurrency::LockGuard guard((concurrency::Lock *)&lock);
LOG_DEBUG("Scanning for i2c devices on port %d\n", port); LOG_DEBUG("Scanning for I2C devices on port %d\n", port);
uint8_t err; uint8_t err;
@ -163,6 +172,11 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
#endif #endif
for (addr.address = 1; addr.address < 127; addr.address++) { for (addr.address = 1; addr.address < 127; addr.address++) {
if (asize != 0) {
if (!in_array(address, asize, addr.address))
continue;
LOG_DEBUG("Scanning address 0x%x\n", addr.address);
}
i2cBus->beginTransmission(addr.address); i2cBus->beginTransmission(addr.address);
#ifdef ARCH_PORTDUINO #ifdef ARCH_PORTDUINO
if (i2cBus->read() != -1) if (i2cBus->read() != -1)
@ -356,7 +370,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address); LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address);
} }
} else if (err == 4) { } else if (err == 4) {
LOG_ERROR("Unknown error at address 0x%x\n", addr); LOG_ERROR("Unknown error at address 0x%x\n", addr.address);
} }
// Check if a type was found for the enumerated device - save, if so // Check if a type was found for the enumerated device - save, if so
@ -367,6 +381,11 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
} }
} }
void ScanI2CTwoWire::scanPort(I2CPort port)
{
scanPort(port, nullptr, 0);
}
TwoWire *ScanI2CTwoWire::fetchI2CBus(ScanI2C::DeviceAddress address) const TwoWire *ScanI2CTwoWire::fetchI2CBus(ScanI2C::DeviceAddress address) const
{ {
if (address.port == ScanI2C::I2CPort::WIRE) { if (address.port == ScanI2C::I2CPort::WIRE) {

Wyświetl plik

@ -16,6 +16,8 @@ class ScanI2CTwoWire : public ScanI2C
public: public:
void scanPort(ScanI2C::I2CPort) override; void scanPort(ScanI2C::I2CPort) override;
void scanPort(ScanI2C::I2CPort, uint8_t *, uint8_t) override;
ScanI2C::FoundDevice find(ScanI2C::DeviceType) const override; ScanI2C::FoundDevice find(ScanI2C::DeviceType) const override;
TwoWire *fetchI2CBus(ScanI2C::DeviceAddress) const; TwoWire *fetchI2CBus(ScanI2C::DeviceAddress) const;

Wyświetl plik

@ -1,5 +1,6 @@
#include "cardKbI2cImpl.h" #include "cardKbI2cImpl.h"
#include "InputBroker.h" #include "InputBroker.h"
#include "detect/ScanI2CTwoWire.h"
#include "main.h" #include "main.h"
CardKbI2cImpl *cardKbI2cImpl; CardKbI2cImpl *cardKbI2cImpl;
@ -9,8 +10,44 @@ CardKbI2cImpl::CardKbI2cImpl() : KbI2cBase("cardKB") {}
void CardKbI2cImpl::init() void CardKbI2cImpl::init()
{ {
if (cardkb_found.address == 0x00) { if (cardkb_found.address == 0x00) {
disable(); LOG_DEBUG("Rescanning for I2C keyboard\n");
return; uint8_t i2caddr_scan[] = {CARDKB_ADDR, TDECK_KB_ADDR, BBQ10_KB_ADDR};
uint8_t i2caddr_asize = 3;
auto i2cScanner = std::unique_ptr<ScanI2CTwoWire>(new ScanI2CTwoWire());
#if defined(I2C_SDA1)
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1, i2caddr_scan, i2caddr_asize);
#endif
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE, i2caddr_scan, i2caddr_asize);
auto kb_info = i2cScanner->firstKeyboard();
if (kb_info.type != ScanI2C::DeviceType::NONE) {
cardkb_found = kb_info.address;
switch (kb_info.type) {
case ScanI2C::DeviceType::RAK14004:
kb_model = 0x02;
break;
case ScanI2C::DeviceType::CARDKB:
kb_model = 0x00;
break;
case ScanI2C::DeviceType::TDECKKB:
// assign an arbitrary value to distinguish from other models
kb_model = 0x10;
break;
case ScanI2C::DeviceType::BBQ10KB:
// assign an arbitrary value to distinguish from other models
kb_model = 0x11;
break;
default:
// use this as default since it's also just zero
LOG_WARN("kb_info.type is unknown(0x%02x), setting kb_model=0x00\n", kb_info.type);
kb_model = 0x00;
}
}
if (cardkb_found.address == 0x00) {
disable();
return;
}
} }
inputBroker->registerSource(this); inputBroker->registerSource(this);

Wyświetl plik

@ -1,6 +1,7 @@
#include "kbI2cBase.h" #include "kbI2cBase.h"
#include "configuration.h" #include "configuration.h"
#include "detect/ScanI2C.h" #include "detect/ScanI2C.h"
#include "detect/ScanI2CTwoWire.h"
extern ScanI2C::DeviceAddress cardkb_found; extern ScanI2C::DeviceAddress cardkb_found;
extern uint8_t kb_model; extern uint8_t kb_model;
@ -29,11 +30,6 @@ uint8_t read_from_14004(TwoWire *i2cBus, uint8_t reg, uint8_t *data, uint8_t len
int32_t KbI2cBase::runOnce() int32_t KbI2cBase::runOnce()
{ {
if (cardkb_found.address == 0x00) {
// Input device is not detected.
return INT32_MAX;
}
if (!i2cBus) { if (!i2cBus) {
switch (cardkb_found.port) { switch (cardkb_found.port) {
case ScanI2C::WIRE1: case ScanI2C::WIRE1:

Wyświetl plik

@ -422,10 +422,6 @@ void setup()
auto i2cCount = i2cScanner->countDevices(); auto i2cCount = i2cScanner->countDevices();
if (i2cCount == 0) { if (i2cCount == 0) {
LOG_INFO("No I2C devices found\n"); LOG_INFO("No I2C devices found\n");
Wire.end();
#ifdef I2C_SDA1
Wire1.end();
#endif
} else { } else {
LOG_INFO("%i I2C devices found\n", i2cCount); LOG_INFO("%i I2C devices found\n", i2cCount);
} }