Files
CDashDisplay/lib/Arduino_GFX/src/databus/Arduino_AVRPAR16.cpp
T
esilva f9d0bfa4d9 First commit
I shall move all this to another branch -> master_vendored or something
2025-03-12 21:42:39 +00:00

244 lines
4.7 KiB
C++

#ifdef __AVR__
#include "Arduino_AVRPAR16.h"
Arduino_AVRPAR16::Arduino_AVRPAR16(int8_t dc, int8_t cs, int8_t wr, int8_t rd, uint8_t portLow, uint8_t portHigh)
: _dc(dc), _cs(cs), _wr(wr), _rd(rd), _portLow(portLow), _portHigh(portHigh)
{
}
bool Arduino_AVRPAR16::begin(int32_t, int8_t)
{
pinMode(_dc, OUTPUT);
digitalWrite(_dc, HIGH); // Data mode
_dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(_dc));
_dcPinMaskSet = digitalPinToBitMask(_dc);
_dcPinMaskClr = ~_dcPinMaskSet;
if (_cs != GFX_NOT_DEFINED)
{
pinMode(_cs, OUTPUT);
digitalWrite(_cs, HIGH); // Disable chip select
_csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(_cs));
_csPinMaskSet = digitalPinToBitMask(_cs);
}
_csPinMaskClr = ~_csPinMaskSet;
pinMode(_wr, OUTPUT);
digitalWrite(_wr, HIGH); // Set write strobe high (inactive)
_wrPort = (PORTreg_t)portOutputRegister(digitalPinToPort(_wr));
_wrPinMaskSet = digitalPinToBitMask(_wr);
_wrPinMaskClr = ~_wrPinMaskSet;
if (_rd != GFX_NOT_DEFINED)
{
pinMode(_rd, OUTPUT);
digitalWrite(_rd, HIGH); // Disable RD
}
*(portModeRegister(_portLow)) = 0xFF;
_dataPortLow = portOutputRegister(_portLow);
*_dataPortLow = 0xFF;
*(portModeRegister(_portHigh)) = 0xFF;
_dataPortHigh = portOutputRegister(_portHigh);
*_dataPortHigh = 0xFF;
return true;
}
void Arduino_AVRPAR16::beginWrite()
{
DC_HIGH();
CS_LOW();
}
void Arduino_AVRPAR16::endWrite()
{
CS_HIGH();
}
void Arduino_AVRPAR16::writeCommand(uint8_t c)
{
DC_LOW();
WRITE16(c);
DC_HIGH();
}
void Arduino_AVRPAR16::writeCommand16(uint16_t c)
{
DC_LOW();
WRITE16(c);
DC_HIGH();
}
void Arduino_AVRPAR16::writeCommandBytes(uint8_t *data, uint32_t len)
{
DC_LOW();
while (len--)
{
WRITE16(*data++);
}
DC_HIGH();
}
void Arduino_AVRPAR16::write(uint8_t d)
{
WRITE16(d);
}
void Arduino_AVRPAR16::write16(uint16_t d)
{
WRITE16(d);
}
void Arduino_AVRPAR16::writeRepeat(uint16_t p, uint32_t len)
{
uint8_t wrMaskBase = *_wrPort & _wrPinMaskClr;
uint8_t wrMaskSet = wrMaskBase | _wrPinMaskSet;
_data16.value = p;
*_dataPortLow = _data16.lsb;
*_dataPortHigh = _data16.msb;
while (len--)
{
*_wrPort = wrMaskBase;
*_wrPort = wrMaskSet;
}
}
void Arduino_AVRPAR16::writePixels(uint16_t *data, uint32_t len)
{
while (len--)
{
WRITE16(*data++);
}
}
void Arduino_AVRPAR16::writeC8D8(uint8_t c, uint8_t d)
{
DC_LOW();
WRITE16(c);
DC_HIGH();
WRITE16(d);
}
void Arduino_AVRPAR16::writeC8D16(uint8_t c, uint16_t d)
{
DC_LOW();
WRITE16(c);
DC_HIGH();
WRITE16(d);
}
void Arduino_AVRPAR16::writeC8D16D16(uint8_t c, uint16_t d1, uint16_t d2)
{
DC_LOW();
WRITE16(c);
DC_HIGH();
WRITE16(d1);
WRITE16(d2);
}
void Arduino_AVRPAR16::writeC8D16D16Split(uint8_t c, uint16_t d1, uint16_t d2)
{
DC_LOW();
uint8_t wrMaskBase = *_wrPort & _wrPinMaskClr;
_data16.value = c;
*_dataPortLow = _data16.lsb;
*_dataPortHigh = _data16.msb;
*_wrPort = wrMaskBase;
*_wrPort = wrMaskBase | _wrPinMaskSet;
DC_HIGH();
_data16.value = d1;
*_dataPortLow = _data16.msb;
*_dataPortHigh = 0;
*_wrPort = wrMaskBase;
*_wrPort = wrMaskBase | _wrPinMaskSet;
*_dataPortLow = _data16.lsb;
*_dataPortHigh = 0;
*_wrPort = wrMaskBase;
*_wrPort = wrMaskBase | _wrPinMaskSet;
_data16.value = d2;
*_dataPortLow = _data16.msb;
*_dataPortHigh = 0;
*_wrPort = wrMaskBase;
*_wrPort = wrMaskBase | _wrPinMaskSet;
*_dataPortLow = _data16.lsb;
*_dataPortHigh = 0;
*_wrPort = wrMaskBase;
*_wrPort = wrMaskBase | _wrPinMaskSet;
}
void Arduino_AVRPAR16::writeBytes(uint8_t *data, uint32_t len)
{
while (len > 1)
{
_data16.msb = *data++;
_data16.lsb = *data++;
WRITE16(_data16.value);
len -= 2;
}
if (len)
{
WRITE16(*data);
}
}
GFX_INLINE void Arduino_AVRPAR16::WRITE16(uint16_t d)
{
uint8_t wrMaskBase = *_wrPort & _wrPinMaskClr;
_data16.value = d;
*_dataPortLow = _data16.lsb;
*_dataPortHigh = _data16.msb;
*_wrPort = wrMaskBase;
*_wrPort = wrMaskBase | _wrPinMaskSet;
}
/******** low level bit twiddling **********/
GFX_INLINE void Arduino_AVRPAR16::DC_HIGH(void)
{
*_dcPort |= _dcPinMaskSet;
}
GFX_INLINE void Arduino_AVRPAR16::DC_LOW(void)
{
*_dcPort &= _dcPinMaskClr;
}
GFX_INLINE void Arduino_AVRPAR16::CS_HIGH(void)
{
if (_cs != GFX_NOT_DEFINED)
{
*_csPort |= _csPinMaskSet;
}
}
GFX_INLINE void Arduino_AVRPAR16::CS_LOW(void)
{
if (_cs != GFX_NOT_DEFINED)
{
*_csPort &= _csPinMaskClr;
}
}
#endif // #ifdef __AVR__