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 
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 
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 
109  bool setOrientation(Orientation orientation) override;
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 
132  {
133  return scrollOffset;
134  }
135 
136 protected:
141  virtual bool initialise() = 0;
142 
146  void sendInitData(const FSTR::ObjectBase& data)
147  {
148  SpiDisplay::execute(commands, data);
149  }
150 
172  {
174  if(mode == defaultAddressMode) {
175  return;
176  }
177 
178  defaultAddressMode = mode;
179  if(isReady()) {
180  setOrientation(orientation);
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
PinSet
How SPI hardware pins are connected.
Definition: Common.h:108
uint8_t resetPin
Definition: SpiDisplay.h:73
uint32_t readDisplayStatus()
Definition: MipiDisplay.h:51
Orientation orientation
Definition: Libraries/Graphics/src/include/Graphics/Device.h:79
Definition: SpiDisplay.h:32
Display list for hardware SPI devices.
Definition: SpiDisplayList.h:34
Defines an SPI Request Packet.
Definition: HardwareSPI/src/include/HSPI/Request.h:57
bool scroll(int16_t y) override
Scroll region of display up or down using hardware scrolling.
Used when defining data structures.
Definition: ObjectBase.hpp:32
Colour in device pixel format.
Definition: Colors.h:339
bool blockFill(const void *data, uint16_t length, uint32_t repeat) override
Definition: MipiDisplay.h:252
Size getSize() const override
Get target dimensions.
Definition: MipiDisplay.h:113
void sendInitData(const FSTR::ObjectBase &data)
Called by implementation to send fixed initialisation sequences.
Definition: MipiDisplay.h:146
Size nativeSize
Size of attached screen.
Definition: MipiDisplay.h:185
uint8_t * getBuffer(uint16_t minBytes, uint16_t &available) override
Definition: MipiDisplay.h:242
Size resolution
Controller resolution.
Definition: MipiDisplay.h:184
uint16_t getScrollOffset() const
Definition: MipiDisplay.h:131
uint32_t readDisplayId()
Definition: MipiDisplay.h:46
Definition: Surface.h:58
void execute(SpiDisplayList &list, DisplayList::Callback callback=nullptr, void *param=nullptr)
Definition: SpiDisplay.h:44
Size getResolution() const
Definition: MipiDisplay.h:99
Location and size of rectangular area (x, y, w, h)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:287
uint8_t readPowerMode()
Definition: MipiDisplay.h:56
bool setAddrWindow(const Rect &rect) override
Definition: MipiDisplay.h:230
Surface * createSurface(size_t bufferSize=0) override
Create a surface for use with this render target.
static const SpiDisplayList::Commands commands
Definition: MipiDisplay.h:30
size_t used
Definition: Surface.h:59
Definition: MipiDisplay.h:197
SpiDisplayList displayList
Definition: MipiDisplay.h:273
Point getAddrOffset() const
Definition: MipiDisplay.h:124
bool begin(HSPI::PinSet pinSet, uint8_t chipSelect, uint8_t dcPin, uint8_t resetPin=PIN_NONE, uint32_t clockSpeed=4000000)
uint8_t readSignalMode()
Definition: MipiDisplay.h:76
Type
Definition: Asset.h:82
A drawable object inherits from this virtual base class.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:96
Stat stat() const override
Definition: MipiDisplay.h:207
uint16_t h
Definition: Libraries/Graphics/src/include/Graphics/Types.h:107
Commonly-used display-specific command codes.
Definition: SpiDisplayList.h:43
MipiDisplay(HSPI::Controller &spi, Size resolution, Size screenSize)
Definition: MipiDisplay.h:34
Size of rectangular area (width x height)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:105
Shared heap-allocated data buffer.
Definition: Graphics/src/include/Graphics/Buffer.h:35
uint8_t readSelfDiag()
Definition: MipiDisplay.h:81
Size getNativeSize() const override
Get physical size of display.
Definition: MipiDisplay.h:94
int16_t y
Definition: Libraries/Graphics/src/include/Graphics/Types.h:289
void(*)(ReadBuffer &data, size_t length, void *param) ReadCallback
Callback for readPixel() operations.
Definition: Surface.h:69
bool isReady() const
Determine if the device is initialised.
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:76
MipiDisplay & display
Definition: MipiDisplay.h:272
uint8_t defaultAddressMode
Definition: MipiDisplay.h:187
Point addrOffset
Display orientation may require adjustment to address window position.
Definition: MipiDisplay.h:186
bool setPixel(PackedColor color, Point pt) override
Definition: MipiDisplay.h:262
static constexpr uint8_t PIN_NONE
Undefined I/O pin value.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:37
uint32_t readRegister(uint8_t cmd, uint8_t byteCount)
Stores result of read operation.
Definition: Graphics/src/include/Graphics/Buffer.h:213
uint8_t readImageFormat()
Definition: MipiDisplay.h:71
bool setScrollMargins(uint16_t top, uint16_t bottom) override
Set margins for hardware scrolling.
Type getType() const
Definition: MipiDisplay.h:202
uint8_t readMADCTL()
Definition: MipiDisplay.h:61
void commit(uint16_t length) override
Definition: MipiDisplay.h:247
Definition: MipiDisplay.h:27
SpiDisplay(HSPI::Controller &spi)
Definition: SpiDisplay.h:35
PixelFormat
Definition: Colors.h:295
void setDefaultAddressMode(uint8_t mode)
Set default address mode setting.
Definition: MipiDisplay.h:171
Size getSize() const override
Definition: MipiDisplay.h:220
Manages access to SPI hardware.
Definition: HardwareSPI/src/include/HSPI/Controller.h:51
PixelFormat getPixelFormat() const override
All surfaces support the same pixel format.
Definition: MipiDisplay.h:118
PixelFormat getPixelFormat() const override
Definition: MipiDisplay.h:225
Interface for a drawing surface.
Definition: Surface.h:41
virtual bool initialise()=0
Perform display-specific initialisation.
Definition: Virtual.h:30
void reset() override
Reset surface ready for more commands.
Definition: MipiDisplay.h:215
Buffer used for reading pixel data from device.
Definition: Graphics/src/include/Graphics/Buffer.h:186
void setNativeSize(Size screenSize)
Sets the screen size. Must be called before calling begin()
Definition: MipiDisplay.h:89
Orientation
Defines orientation of display.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:47
constexpr Size rotate(Size size, Orientation orientation)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:122
bool writeDataBuffer(SharedBuffer &data, size_t offset, uint16_t length) override
Definition: MipiDisplay.h:257
uint32_t getSpeed() const
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:91
uint8_t readPixelFormat()
Definition: MipiDisplay.h:66
bool setOrientation(Orientation orientation) override
Set display orientation.
void(*)(void *param) PresentCallback
Definition: Surface.h:63