kopia lustrzana https://github.com/meshtastic/firmware
				
				
				
			Merge pull request #3933 from HarukiToreda/master
Boot issue fix of Cardkb on ESP32pull/4109/head^2
						commit
						5fceab7f0f
					
				| 
						 | 
				
			
			@ -6,6 +6,7 @@ const ScanI2C::FoundDevice ScanI2C::DEVICE_NONE = ScanI2C::FoundDevice(ScanI2C::
 | 
			
		|||
ScanI2C::ScanI2C() = default;
 | 
			
		||||
 | 
			
		||||
void ScanI2C::scanPort(ScanI2C::I2CPort port) {}
 | 
			
		||||
void ScanI2C::scanPort(ScanI2C::I2CPort port, uint8_t *address, uint8_t asize) {}
 | 
			
		||||
 | 
			
		||||
void ScanI2C::setSuppressScreen()
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,6 +88,7 @@ class ScanI2C
 | 
			
		|||
    ScanI2C();
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,15 @@
 | 
			
		|||
#define XPOWERS_AXP192_AXP2101_ADDRESS 0x34
 | 
			
		||||
#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
 | 
			
		||||
{
 | 
			
		||||
    concurrency::LockGuard guard((concurrency::Lock *)&lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -135,11 +144,11 @@ uint16_t ScanI2CTwoWire::getRegisterValue(const ScanI2CTwoWire::RegisterLocation
 | 
			
		|||
        type = T;                                                                                                                \
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
void ScanI2CTwoWire::scanPort(I2CPort port)
 | 
			
		||||
void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
 | 
			
		||||
{
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -163,6 +172,11 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
#ifdef ARCH_PORTDUINO
 | 
			
		||||
        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);
 | 
			
		||||
            }
 | 
			
		||||
        } 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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
{
 | 
			
		||||
    if (address.port == ScanI2C::I2CPort::WIRE) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,8 @@ class ScanI2CTwoWire : public ScanI2C
 | 
			
		|||
  public:
 | 
			
		||||
    void scanPort(ScanI2C::I2CPort) override;
 | 
			
		||||
 | 
			
		||||
    void scanPort(ScanI2C::I2CPort, uint8_t *, uint8_t) override;
 | 
			
		||||
 | 
			
		||||
    ScanI2C::FoundDevice find(ScanI2C::DeviceType) const override;
 | 
			
		||||
 | 
			
		||||
    TwoWire *fetchI2CBus(ScanI2C::DeviceAddress) const;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,4 +55,4 @@ class ScanI2CTwoWire : public ScanI2C
 | 
			
		|||
    uint16_t getRegisterValue(const RegisterLocation &, ResponseWidth) const;
 | 
			
		||||
 | 
			
		||||
    DeviceType probeOLED(ScanI2C::DeviceAddress) const;
 | 
			
		||||
};
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
#include "cardKbI2cImpl.h"
 | 
			
		||||
#include "InputBroker.h"
 | 
			
		||||
#include "detect/ScanI2CTwoWire.h"
 | 
			
		||||
#include "main.h"
 | 
			
		||||
 | 
			
		||||
CardKbI2cImpl *cardKbI2cImpl;
 | 
			
		||||
| 
						 | 
				
			
			@ -9,8 +10,44 @@ CardKbI2cImpl::CardKbI2cImpl() : KbI2cBase("cardKB") {}
 | 
			
		|||
void CardKbI2cImpl::init()
 | 
			
		||||
{
 | 
			
		||||
    if (cardkb_found.address == 0x00) {
 | 
			
		||||
        disable();
 | 
			
		||||
        return;
 | 
			
		||||
        LOG_DEBUG("Rescanning for I2C keyboard\n");
 | 
			
		||||
        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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#include "kbI2cBase.h"
 | 
			
		||||
#include "configuration.h"
 | 
			
		||||
#include "detect/ScanI2C.h"
 | 
			
		||||
#include "detect/ScanI2CTwoWire.h"
 | 
			
		||||
 | 
			
		||||
extern ScanI2C::DeviceAddress cardkb_found;
 | 
			
		||||
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()
 | 
			
		||||
{
 | 
			
		||||
    if (cardkb_found.address == 0x00) {
 | 
			
		||||
        // Input device is not detected.
 | 
			
		||||
        return INT32_MAX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!i2cBus) {
 | 
			
		||||
        switch (cardkb_found.port) {
 | 
			
		||||
        case ScanI2C::WIRE1:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -422,10 +422,6 @@ void setup()
 | 
			
		|||
    auto i2cCount = i2cScanner->countDevices();
 | 
			
		||||
    if (i2cCount == 0) {
 | 
			
		||||
        LOG_INFO("No I2C devices found\n");
 | 
			
		||||
        Wire.end();
 | 
			
		||||
#ifdef I2C_SDA1
 | 
			
		||||
        Wire1.end();
 | 
			
		||||
#endif
 | 
			
		||||
    } else {
 | 
			
		||||
        LOG_INFO("%i I2C devices found\n", i2cCount);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue