Hi Greg,
Thanks for the replies. Comments embedded;
What is the interface to the ePaper device? Is it through a serial
interface? Or a framebuffer interface?
The interface is over SPI. It 'looks like' a normal lcd supported by
lcd_dev_s. The particular one I have is write-only, but read/write ones
exist too.
What do you might by NXGL? It is library of simply drawing helpers.
I take it you are not using NX, the full graphics system. It would
update automatically and we would not be having this discussion.
It's worth explaining a little bit more about how these devices work,
then it'll be clearer, I hope.
They have a display RAM just like an SPI or I2C interfaced LCD does. You
write to it in the same way using similar commands. The difference is
that the display RAM _does _not_ automatically get transferred onto the
screen. That has to be done by a separate operation which, depending on
the device in question, can take up to 15 seconds or so.
NXGL offers a nice set of drawing primitives which remain applicable to
these displays. There is no difference to NXGL or the way that it is
used, and no code in NXGL is changed to allow it to work with ePaper.
Unfortunately, nothing changes on the screen until the send-to-screen
(redraw) command is issued.
Since you are redrawing something that was not drawn by NX, it must be
something that you drew in your application? True? Are you using a
software framebuffer?
It was drawn by NX, it just didn't make it to the screen yet.
The correct way to implement a software framebuffer driver for a
serial graphics device is via drivers/lcd/lcd_framebuffer.c. That
driver will allocate the software framebuffer and export a standard
NuttX framebuffer driver interface. The framebuffer driver at
drivers/video/fb.c will expose the framebuffer driver to the
application. From the framebuffer driver you can use the FIOC_MMAP
IOCTL command to get the address of the framebuffer. You would need
enable CONFIG_LCD_UPDATE, then you can use FBIO_UPDATE command to
force the software software framebuffer to be written to the serial
hardware.
A framebuffer isn't needed, as there is already one on the device.
However, what I need to do is directly equivalent to FBIO_UPDATE.
Normally FBIO_UPDATE works from NuttX RAM to the LCD (and automatically
onto the display), I want to go from the ePaper RAM to the display.
Using the framebuffer wouldn't help me as I'd still need to perform the
redraw operation to get the stuff onto the actual display after sending
the FBIO_UPDATE.
Now, that sounds like you are using NX. NX will automatically update
the display.
I cannot imagine a situation where that would be necessary. Let's talk
more before you waste your time. I would have to understand what you
are really doing to be able to help you.
NX _thinks_ it's updated the display and indeed, in the normal scheme of
things (with an LCD), it would have. Unfortunately, for this class of
displays, this second step to sync the display ram to the display itself
is needed.
I've just read through the other notes you've sent. To avoid fragmenting
my reply;
*) It's an ePaper electrophoretic display which is bi-stable - whatever
is on the display will stay there, even without power. That means
transferring the contents of the display frame memory to the display is
a second step operation which takes a while to happen.
*) I can use nxgl to write to it no problem. As far as nxgl is
concerned it looks just like an ILI9341 or similar (different command
set, but the same principles). The problem is that what is written to it
does not end up on the display until a separate, time consuming, redraw
command is issued. While the redraw is going on the display is away with
the faries and will not communicate at all. That isn't a problem for us
as new drawing commands will just back up in the NXGL MQ until it
becomes available again.
*) There is no modification needed to any existing nxgl or other code
for this to work...it's a simple extension to add this redraw
command...but I need to be comfortable that I've put it in the right
place, hence why I'm asking for input. It means that some practical
details of the implementation of the display technology are 'leaking' up
into the graphics abstraction, but I don't really see a way to avoid it.
Only the application knows when it's permissible to take an extended
time to perform an update.
Regards
DAVE