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:
31 
33 
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 
56  uint8_t readPowerMode()
57  {
59  }
60 
61  uint8_t readMADCTL()
62  {
64  }
65 
66  uint8_t readPixelFormat()
67  {
69  }
70 
71  uint8_t readImageFormat()
72  {
74  }
75 
76  uint8_t readSignalMode()
77  {
79  }
80 
81  uint8_t readSelfDiag()
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 
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
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 
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 
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  {
217  displayList.reset();
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
Used when defining data structures.
Definition: ObjectBase.hpp:33
Type
Definition: Asset.h:82
Orientation orientation
Definition: Libraries/Graphics/src/include/Graphics/Device.h:79
void reset()
Reset the display list ready for re-use List MUST NOT be in use!
bool writeDataBuffer(SharedBuffer &data, size_t offset, uint16_t length)
Add WRITE command plus external data.
bool setPixel(PackedColor color, uint8_t bytesPerPixel, Point pt)
Set a single pixel.
void commit(uint16_t length)
Commit block of data to the list.
uint16_t used() const
Get number of bytes stored in buffer.
Definition: DisplayList.h:295
bool setAddrWindow(const Rect &rect)
Set window for read/write operations.
uint16_t freeSpace() const
Get number of bytes remaining in buffer.
Definition: DisplayList.h:279
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)
Perform a block fill operation with repeat, e.g. multiple pixel fill or repeated pattern.
Definition: MipiDisplay.h:28
uint16_t getScrollOffset() const
Definition: MipiDisplay.h:131
uint32_t readRegister(uint8_t cmd, uint8_t byteCount)
Size nativeSize
Size of attached screen.
Definition: MipiDisplay.h:185
bool scroll(int16_t y) override
Scroll region of display up or down using hardware scrolling.
bool begin(HSPI::PinSet pinSet, uint8_t chipSelect, uint8_t dcPin, uint8_t resetPin=PIN_NONE, uint32_t clockSpeed=4000000)
bool setScrollMargins(uint16_t top, uint16_t bottom) override
Set margins for hardware scrolling.
PixelFormat getPixelFormat() const override
All surfaces support the same pixel format.
Definition: MipiDisplay.h:118
Point getAddrOffset() const
Definition: MipiDisplay.h:124
void setNativeSize(Size screenSize)
Sets the screen size. Must be called before calling begin()
Definition: MipiDisplay.h:89
bool setOrientation(Orientation orientation) override
Set display orientation.
uint8_t readPixelFormat()
Definition: MipiDisplay.h:66
void setDefaultAddressMode(uint8_t mode)
Set default address mode setting.
Definition: MipiDisplay.h:171
Size resolution
Controller resolution.
Definition: MipiDisplay.h:184
uint8_t readMADCTL()
Definition: MipiDisplay.h:61
uint32_t readDisplayStatus()
Definition: MipiDisplay.h:51
uint8_t readSignalMode()
Definition: MipiDisplay.h:76
void sendInitData(const FSTR::ObjectBase &data)
Called by implementation to send fixed initialisation sequences.
Definition: MipiDisplay.h:146
Point addrOffset
Display orientation may require adjustment to address window position.
Definition: MipiDisplay.h:186
Size getResolution() const
Definition: MipiDisplay.h:99
uint8_t defaultAddressMode
Definition: MipiDisplay.h:187
uint8_t readImageFormat()
Definition: MipiDisplay.h:71
uint8_t readPowerMode()
Definition: MipiDisplay.h:56
MipiDisplay(HSPI::Controller &spi, Size resolution, Size screenSize)
Definition: MipiDisplay.h:34
Size getSize() const override
Get target dimensions.
Definition: MipiDisplay.h:113
uint8_t readSelfDiag()
Definition: MipiDisplay.h:81
uint32_t readDisplayId()
Definition: MipiDisplay.h:46
static const SpiDisplayList::Commands commands
Definition: MipiDisplay.h:30
Size getNativeSize() const override
Get physical size of display.
Definition: MipiDisplay.h:94
virtual bool initialise()=0
Perform display-specific initialisation.
Surface * createSurface(size_t bufferSize=0) override
Create a surface for use with this render target.
Definition: MipiDisplay.h:198
PixelFormat getPixelFormat() const override
Definition: MipiDisplay.h:225
uint8_t * getBuffer(uint16_t minBytes, uint16_t &available) override
Definition: MipiDisplay.h:242
bool setAddrWindow(const Rect &rect) override
Definition: MipiDisplay.h:230
void commit(uint16_t length) override
Definition: MipiDisplay.h:247
SpiDisplayList displayList
Definition: MipiDisplay.h:273
Stat stat() const override
Definition: MipiDisplay.h:207
Size getSize() const override
Definition: MipiDisplay.h:220
int readDataBuffer(ReadBuffer &buffer, ReadStatus *status, ReadCallback callback, void *param) override
Read some pixels.
MipiSurface(MipiDisplay &display, size_t bufferSize)
bool setPixel(PackedColor color, Point pt) override
Definition: MipiDisplay.h:262
bool present(PresentCallback callback, void *param) override
Present surface to display device.
bool render(const Object &object, const Rect &location, std::unique_ptr< Renderer > &renderer) override
Start rendering an object.
void reset() override
Reset surface ready for more commands.
Definition: MipiDisplay.h:215
MipiDisplay & display
Definition: MipiDisplay.h:272
bool writeDataBuffer(SharedBuffer &data, size_t offset, uint16_t length) override
Definition: MipiDisplay.h:257
bool blockFill(const void *data, uint16_t length, uint32_t repeat) override
Definition: MipiDisplay.h:252
Type getType() const
Definition: MipiDisplay.h:202
A drawable object inherits from this virtual base class.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:97
Shared heap-allocated data buffer.
Definition: Graphics/src/include/Graphics/Buffer.h:36
Display list for hardware SPI devices.
Definition: SpiDisplayList.h:35
Definition: SpiDisplay.h:33
SpiDisplay(HSPI::Controller &spi)
Definition: SpiDisplay.h:35
void execute(SpiDisplayList &list, DisplayList::Callback callback=nullptr, void *param=nullptr)
Definition: SpiDisplay.h:43
uint8_t resetPin
Definition: SpiDisplay.h:72
Interface for a drawing surface.
Definition: Surface.h:42
void(*)(ReadBuffer &data, size_t length, void *param) ReadCallback
Callback for readPixel() operations.
Definition: Surface.h:69
void(*)(void *param) PresentCallback
Definition: Surface.h:63
Manages access to SPI hardware.
Definition: HardwareSPI/src/include/HSPI/Controller.h:52
bool isReady() const
Determine if the device is initialised.
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:76
uint32_t getSpeed() const
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:91
@ DCS_ADDRESS_MODE_BGR
Definition: Mipi.h:169
@ DCS_GET_PIXEL_FORMAT
Definition: Mipi.h:112
@ DCS_GET_DISPLAY_MODE
Definition: Mipi.h:113
@ DCS_GET_POWER_MODE
Definition: Mipi.h:110
@ DCS_GET_ADDRESS_MODE
Definition: Mipi.h:111
@ DCS_GET_DISPLAY_STATUS
Definition: Mipi.h:109
@ DCS_GET_DISPLAY_ID
Definition: Mipi.h:104
@ DCS_GET_DIAGNOSTIC_RESULT
Definition: Mipi.h:115
Definition: Virtual.h:31
Orientation
Defines orientation of display.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:47
static constexpr uint8_t PIN_NONE
Undefined I/O pin value.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:37
constexpr Size rotate(Size size, Orientation orientation)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:122
PixelFormat
Definition: Colors.h:295
PinSet
How SPI hardware pins are connected.
Definition: Common.h:108
Colour in device pixel format.
Definition: Colors.h:339
Buffer used for reading pixel data from device.
Definition: Graphics/src/include/Graphics/Buffer.h:186
Stores result of read operation.
Definition: Graphics/src/include/Graphics/Buffer.h:213
Location and size of rectangular area (x, y, w, h)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:287
int16_t y
Definition: Libraries/Graphics/src/include/Graphics/Types.h:289
Size of rectangular area (width x height)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:105
uint16_t h
Definition: Libraries/Graphics/src/include/Graphics/Types.h:107
Commonly-used display-specific command codes.
Definition: SpiDisplayList.h:43
Definition: Surface.h:58
size_t used
Definition: Surface.h:59
Defines an SPI Request Packet.
Definition: HardwareSPI/src/include/HSPI/Request.h:57