244 lines
4.7 KiB
C++
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__
|