MipiDisplay.h
Go to the documentation of this file.
1 /****
2  * Mipi.h
3  *
4  * This file is part of the Sming-Graphics Library
5  *
6  * This library is free software: you can redistribute it and/or modify it under the terms of the
7  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
8  *
9  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along with this library.
14  * If not, see <https://www.gnu.org/licenses/>.
15  *
16  ****/
17 
18 #pragma once
19 
20 #include "SpiDisplay.h"
21 #include "Mipi.h"
22 
23 namespace Graphics
24 {
25 class MipiSurface;
26 
27 class MipiDisplay : public SpiDisplay
28 {
29 public:
30  static const SpiDisplayList::Commands commands;
31 
33 
34  MipiDisplay(HSPI::Controller& spi, Size resolution, Size screenSize)
35  : SpiDisplay(spi), resolution(resolution), nativeSize(screenSize)
36  {
37  }
38 
39  bool begin(HSPI::PinSet pinSet, uint8_t chipSelect, uint8_t dcPin, uint8_t resetPin = PIN_NONE,
40  uint32_t clockSpeed = 4000000);
41 
43 
44  uint32_t readRegister(uint8_t cmd, uint8_t byteCount);
45 
46  uint32_t readDisplayId()
47  {
48  return readRegister(Mipi::DCS_GET_DISPLAY_ID, 4) >> 8;
49  }
50 
51  uint32_t readDisplayStatus()
52  {
54  }
55 
57  {
59  }
60 
62  {
64  }
65 
67  {
69  }
70 
72  {
74  }
75 
77  {
79  }
80 
82  {
84  }
85 
89  void setNativeSize(Size screenSize)
90  {
91  nativeSize = screenSize;
92  }
93 
94  Size getNativeSize() const override
95  {
96  return nativeSize;
97  }
98 
99  Size getResolution() const
100  {
101  return resolution;
102  }
103 
104  bool setScrollMargins(uint16_t top, uint16_t bottom) override;
105  bool scroll(int16_t y) override;
106 
107  /* Device */
108 
110 
111  /* RenderTarget */
112 
113  Size getSize() const override
114  {
115  return rotate(nativeSize, orientation);
116  }
117 
118  PixelFormat getPixelFormat() const override
119  {
120  return PixelFormat::RGB565;
121  }
122 
123  // Used by Surface to adjust for screen orientation
124  Point getAddrOffset() const
125  {
126  return addrOffset;
127  }
128 
129  Surface* createSurface(size_t bufferSize = 0) override;
130 
131  uint16_t getScrollOffset() const
132  {
133  return scrollOffset;
134  }
135 
136 protected:
141  virtual bool initialise() = 0;
142 
146  void sendInitData(const FSTR::ObjectBase& data)
147  {
149  }
150 
171  void setDefaultAddressMode(uint8_t mode)
172  {
174  if(mode == defaultAddressMode) {
175  return;
176  }
177 
178  defaultAddressMode = mode;
179  if(isReady()) {
181  }
182  }
183 
184  Size resolution{};
185  Size nativeSize{};
188 
189 private:
190  static bool transferBeginEnd(HSPI::Request& request);
191 
192  uint8_t dcPin{PIN_NONE};
193  bool dcState{};
194  uint16_t scrollOffset{0};
195 };
196 
197 class MipiSurface : public Graphics::Surface
198 {
199 public:
200  MipiSurface(MipiDisplay& display, size_t bufferSize);
201 
202  Type getType() const
203  {
204  return Type::Device;
205  }
206 
207  Stat stat() const override
208  {
209  return Stat{
210  .used = displayList.used(),
211  .available = displayList.freeSpace(),
212  };
213  }
214 
215  void reset() override
216  {
218  }
219 
220  Size getSize() const override
221  {
222  return display.getSize();
223  }
224 
225  PixelFormat getPixelFormat() const override
226  {
227  return display.getPixelFormat();
228  }
229 
230  bool setAddrWindow(const Rect& rect) override
231  {
232  Rect r = rect;
233  r.y -= display.getScrollOffset();
234  r += display.getAddrOffset();
235  while(r.y < 0) {
236  r.y += display.getResolution().h;
237  }
238  r.y %= display.getResolution().h;
239  return displayList.setAddrWindow(r);
240  }
241 
242  uint8_t* getBuffer(uint16_t minBytes, uint16_t& available) override
243  {
244  return displayList.getBuffer(minBytes, available);
245  }
246 
247  void commit(uint16_t length) override
248  {
249  displayList.commit(length);
250  }
251 
252  bool blockFill(const void* data, uint16_t length, uint32_t repeat) override
253  {
254  return displayList.blockFill(data, length, repeat);
255  }
256 
257  bool writeDataBuffer(SharedBuffer& data, size_t offset, uint16_t length) override
258  {
259  return displayList.writeDataBuffer(data, offset, length);
260  }
261 
262  bool setPixel(PackedColor color, Point pt) override
263  {
264  return displayList.setPixel(color, 2, pt);
265  }
266 
267  int readDataBuffer(ReadBuffer& buffer, ReadStatus* status, ReadCallback callback, void* param) override;
268  bool render(const Object& object, const Rect& location, std::unique_ptr<Renderer>& renderer) override;
269  bool present(PresentCallback callback, void* param) override;
270 
271 protected:
274 };
275 
276 } // namespace Graphics
uint8_t resetPin
Definition: SpiDisplay.h:110
@ DCS_GET_PIXEL_FORMAT
Definition: Mipi.h:142
MipiSurface(MipiDisplay &display, size_t bufferSize)
Size getSize() const override
Get target dimensions.
Definition: MipiDisplay.h:128
Type
Definition: Surface.h:69
void sendInitData(const FSTR::ObjectBase &data)
Called by implementation to send fixed initialisation sequences.
Definition: MipiDisplay.h:161
bool scroll(int16_t y) override
Scroll region of display up or down using hardware scrolling.
@ DCS_GET_DISPLAY_STATUS
Definition: Mipi.h:139
Orientation orientation
Definition: Libraries/Graphics/src/include/Graphics/Device.h:117
Location and size of rectangular area (x, y, w, h)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:306
int readDataBuffer(ReadBuffer &buffer, ReadStatus *status, ReadCallback callback, void *param) override
Read some pixels.
Size resolution
Controller resolution.
Definition: MipiDisplay.h:199
bool render(const Object &object, const Rect &location, std::unique_ptr< Renderer > &renderer) override
Start rendering an object.
uint8_t * getBuffer(uint16_t &available)
Get some space in the list to write pixel data.
bool blockFill(const void *data, uint16_t length, uint32_t repeat) override
Definition: MipiDisplay.h:267
void(*)(void *param) PresentCallback
Definition: Surface.h:82
uint32_t getSpeed() const
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:151
Size getResolution() const
Definition: MipiDisplay.h:114
Size nativeSize
Size of attached screen.
Definition: MipiDisplay.h:200
uint8_t readPowerMode()
Definition: MipiDisplay.h:71
uint8_t * getBuffer(uint16_t minBytes, uint16_t &available) override
Definition: MipiDisplay.h:257
bool setAddrWindow(const Rect &rect) override
Definition: MipiDisplay.h:245
Surface * createSurface(size_t bufferSize=0) override
Create a surface for use with this render target.
@ DCS_GET_DISPLAY_ID
Definition: Mipi.h:134
void(*)(ReadBuffer &data, size_t length, void *param) ReadCallback
Callback for readPixel() operations.
Definition: Surface.h:88
static const SpiDisplayList::Commands commands
Definition: MipiDisplay.h:45
Manages access to SPI hardware.
Definition: HardwareSPI/src/include/HSPI/Controller.h:71
Interface for a drawing surface.
Definition: Surface.h:60
uint16_t getScrollOffset() const
Definition: MipiDisplay.h:146
uint32_t readDisplayId()
Definition: MipiDisplay.h:61
Used when defining data structures.
Definition: ObjectBase.hpp:51
Point getAddrOffset() const
Definition: MipiDisplay.h:139
SpiDisplay(HSPI::Controller &spi)
Definition: SpiDisplay.h:73
static constexpr uint8_t PIN_NONE
Undefined I/O pin value.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:56
bool begin(HSPI::PinSet pinSet, uint8_t chipSelect, uint8_t dcPin, uint8_t resetPin=PIN_NONE, uint32_t clockSpeed=4000000)
bool blockFill(const void *data, uint16_t length, uint32_t repeat)
Perform a block fill operation with repeat, e.g. multiple pixel fill or repeated pattern.
Size of rectangular area (width x height)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:124
Definition: MipiDisplay.h:42
@ DCS_GET_DISPLAY_MODE
Definition: Mipi.h:143
Buffer used for reading pixel data from device.
Definition: Graphics/src/include/Graphics/Buffer.h:205
Definition: Virtual.h:30
SpiDisplayList displayList
Definition: MipiDisplay.h:288
TPoint< int16_t > Point
Definition: Libraries/Graphics/src/include/Graphics/Types.h:299
Stat stat() const override
Definition: MipiDisplay.h:222
A drawable object inherits from this virtual base class.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:115
uint16_t h
Definition: Libraries/Graphics/src/include/Graphics/Types.h:126
uint8_t readSignalMode()
Definition: MipiDisplay.h:91
@ DCS_GET_ADDRESS_MODE
Definition: Mipi.h:141
void commit(uint16_t length)
Commit block of data to the list.
bool present(PresentCallback callback, void *param) override
Present surface to display device.
int16_t y
Definition: Libraries/Graphics/src/include/Graphics/Types.h:308
Defines an SPI Request Packet.
Definition: HardwareSPI/src/include/HSPI/Request.h:79
PinSet
How SPI hardware pins are connected.
Definition: Common.h:108
MipiDisplay & display
Definition: MipiDisplay.h:287
uint16_t used() const
Get number of bytes stored in buffer.
Definition: DisplayList.h:295
MipiDisplay(HSPI::Controller &spi, Size resolution, Size screenSize)
Definition: MipiDisplay.h:49
Point addrOffset
Display orientation may require adjustment to address window position.
Definition: MipiDisplay.h:201
uint16_t freeSpace() const
Get number of bytes remaining in buffer.
Definition: DisplayList.h:279
@ DCS_ADDRESS_MODE_BGR
Definition: Mipi.h:199
uint8_t readSelfDiag()
Definition: MipiDisplay.h:96
uint32_t readRegister(uint8_t cmd, uint8_t byteCount)
bool setPixel(PackedColor color, Point pt) override
Definition: MipiDisplay.h:277
bool setPixel(PackedColor color, uint8_t bytesPerPixel, Point pt)
Set a single pixel.
Size getNativeSize() const override
Get physical size of display.
Definition: MipiDisplay.h:109
uint8_t readImageFormat()
Definition: MipiDisplay.h:86
Stores result of read operation.
Definition: Graphics/src/include/Graphics/Buffer.h:232
Orientation
Defines orientation of display.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:66
bool setScrollMargins(uint16_t top, uint16_t bottom) override
Set margins for hardware scrolling.
bool isReady() const
Determine if the device is initialised.
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:136
uint8_t defaultAddressMode
Definition: MipiDisplay.h:202
PixelFormat
Definition: Colors.h:295
Shared heap-allocated data buffer.
Definition: Graphics/src/include/Graphics/Buffer.h:54
Size getSize() const override
Definition: MipiDisplay.h:235
PixelFormat getPixelFormat() const override
Definition: MipiDisplay.h:240
Type getType() const
Definition: MipiDisplay.h:217
constexpr Size rotate(Size size, Orientation orientation)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:141
virtual bool initialise()=0
Perform display-specific initialisation.
void reset() override
Reset surface ready for more commands.
Definition: MipiDisplay.h:230
uint8_t readMADCTL()
Definition: MipiDisplay.h:76
void setNativeSize(Size screenSize)
Sets the screen size. Must be called before calling begin()
Definition: MipiDisplay.h:104
Display list for hardware SPI devices.
Definition: SpiDisplayList.h:53
void commit(uint16_t length) override
Definition: MipiDisplay.h:262
bool writeDataBuffer(SharedBuffer &data, size_t offset, uint16_t length)
Add WRITE command plus external data.
bool writeDataBuffer(SharedBuffer &data, size_t offset, uint16_t length) override
Definition: MipiDisplay.h:272
uint8_t readPixelFormat()
Definition: MipiDisplay.h:81
void setDefaultAddressMode(uint8_t mode)
Set default address mode setting.
Definition: MipiDisplay.h:186
PixelFormat getPixelFormat() const override
All surfaces support the same pixel format.
Definition: MipiDisplay.h:133
bool setAddrWindow(const Rect &rect)
Set window for read/write operations.
Colour in device pixel format.
Definition: Colors.h:339
size_t used
Definition: Surface.h:78
bool setOrientation(Orientation orientation) override
Set display orientation.
void execute(SpiDisplayList &list, DisplayList::Callback callback=nullptr, void *param=nullptr)
Definition: SpiDisplay.h:81
@ DCS_GET_POWER_MODE
Definition: Mipi.h:140
void reset()
Reset the display list ready for re-use List MUST NOT be in use!
uint32_t readDisplayStatus()
Definition: MipiDisplay.h:66
@ DCS_GET_DIAGNOSTIC_RESULT
Definition: Mipi.h:145