drivers/lcd: Add support for creating display lists incrementally.

This commit is contained in:
Gregory Nutt 2018-02-17 14:48:18 -06:00
parent e4292dced8
commit 885ab75045
3 changed files with 80 additions and 46 deletions

View File

@ -104,10 +104,6 @@ static ssize_t ft80x_read(FAR struct file *filep, FAR char *buffer,
static ssize_t ft80x_write(FAR struct file *filep, FAR const char *buffer,
size_t buflen);
static int ft80x_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
#ifndef CONFIG_DISABLE_POLL
static int ft80x_poll(FAR struct file *filep, FAR struct pollfd *fds,
bool setup);
#endif
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
static int ft80x_unlink(FAR struct inode *inode);
#endif
@ -129,7 +125,7 @@ static const struct file_operations g_ft80x_fops =
NULL, /* seek */
ft80x_ioctl /* ioctl */
#ifndef CONFIG_DISABLE_POLL
, ft80x_poll /* poll */
, NULL /* poll */
#endif
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
, ft80x_unlink /* unlink */
@ -322,7 +318,7 @@ static ssize_t ft80x_write(FAR struct file *filep, FAR const char *buffer,
priv = inode->i_private;
if (buffer == NULL || ((uintptr_t)buffer & 3) != 0 ||
len == 0 || (len & 3) != 0 || len > FT80X_RAM_DL_SIZE)
len == 0 || (len & 3) != 0 || (len + filep->f_pos) > FT80X_RAM_DL_SIZE)
{
return -EINVAL;
}
@ -339,12 +335,13 @@ static ssize_t ft80x_write(FAR struct file *filep, FAR const char *buffer,
* would be a silly thing to do.
*/
/* The write method is functionally equivalent to the FT80XIOC_PUTDISPLAYLIST
/* The write method is functionally equivalent to the FT80X_IOC_CREATEDL
* IOCTL command: It simply copies the display list in the user buffer to
* the FT80x display list memory.
*/
ft80x_write_memory(priv, FT80X_RAM_DL, buffer, len);
ft80x_write_memory(priv, FT80X_RAM_DL + filep->f_pos, buffer, len);
filep->f_pos += len;
nxsem_post(&priv->exclsem);
return len;
@ -383,21 +380,47 @@ static int ft80x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
switch (cmd)
{
/* FT80XIOC_PUTDISPLAYLIST:
/* FT80X_IOC_CREATEDL:
* Description: Write a display list to the FT80x display list memory
* Description: Write a display list to the FT80x display list memory
* starting at offset zero. This may or may not be the
* entire display list. Display lists may be created
* incrementally, starting with FT80X_IOC_CREATEDL and
* finishing the display list using FT80XIO_APPENDDL
* Argument: A reference to a display list structure instance.
* See struct ft80x_displaylist_s.
* Returns: None
*/
case FT80XIOC_PUTDISPLAYLIST:
case FT80X_IOC_CREATEDL:
/* Set the file position to zero and fall through to "append" the new
* display list data at offset 0.
*/
filep->f_pos = 0;
/* FALLTHROUGH */
/* FT80X_IOC_APPENDDL:
* Description: Write additional display list entries to the FT80x
* display list memory at the current display list offset.
* This IOCTL command permits display lists to be completed
* incrementally, starting with FT80X_IOC_CREATEDL and
* finishing the display list using FT80XIO_APPENDDL.
* Argument: A reference to a display list structure instance. See
* struct ft80x_displaylist_s.
* Returns: None
*/
case FT80X_IOC_APPENDDL:
{
FAR struct ft80x_displaylist_s *dl =
(FAR struct ft80x_displaylist_s *)((uintptr_t)arg);
if (dl == NULL || ((uintptr_t)&dl->cmd & 3) != 0 ||
dl->dlsize == 0 || (dl->dlsize & 3) != 0 ||
dl->dlsize > FT80X_RAM_DL_SIZE)
dl->dlsize + filep->f_pos > FT80X_RAM_DL_SIZE)
{
ret = -EINVAL;
}
@ -407,19 +430,21 @@ static int ft80x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
* provided into the FT80x display list memory.
*/
ft80x_write_memory(priv, FT80X_RAM_DL, &dl->cmd, dl->dlsize);
ft80x_write_memory(priv, FT80X_RAM_DL + filep->f_pos,
&dl->cmd, dl->dlsize);
filep->f_pos += dl->dlsize;
ret = OK;
}
}
break;
/* FT80XIOC_GETRESULT32:
/* FT80X_IOC_GETRESULT32:
* Description: Read a 32-bit value from the display list.
* Argument: A reference to an instance of struct ft80x_result32_s.
* Returns: The 32-bit value read from the display list.
*/
case FT80XIOC_GETRESULT32:
case FT80X_IOC_GETRESULT32:
{
FAR struct ft80x_result32_s *result =
(FAR struct ft80x_result32_s *)((uintptr_t)arg);
@ -438,7 +463,7 @@ static int ft80x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
}
break;
/* FT80XIOC_GETTRACKER:
/* FT80X_IOC_GETTRACKER:
* Description: After CMD_TRACK has been issued, the coprocessor
* will update the TRACKER register with new position
* data.
@ -446,7 +471,7 @@ static int ft80x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
* Returns: The new content of the tracker register.
*/
case FT80XIOC_GETTRACKER:
case FT80X_IOC_GETTRACKER:
{
FAR uint32_t *tracker = (FAR uint32_t *)((uintptr_t)arg);
@ -474,19 +499,6 @@ static int ft80x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
return ret;
}
/****************************************************************************
* Name: ft80x_poll
****************************************************************************/
#ifndef CONFIG_DISABLE_POLL
static int ft80x_poll(FAR struct file *filep, FAR struct pollfd *fds,
bool setup)
{
#warning Missing logic
return -ENOSYS;
}
#endif
/****************************************************************************
* Name: ft80x_unlink
****************************************************************************/

View File

@ -97,7 +97,9 @@ off_t file_seek(FAR struct file *filep, off_t offset, int whence)
{
case SEEK_CUR:
offset += filep->f_pos;
/* FALLTHROUGH */
case SEEK_SET:
if (offset >= 0)
{

View File

@ -65,43 +65,63 @@
/* FT80x IOCTL commands:
*
* FT80XIOC_PUTDISPLAYLIST:
* FT80X_IOC_CREATEDL:
* Description: Write a display list to the FT80x display list memory
* starting at offset zero. This may or may not be the
* entire display list. Display lists may be created
* incrementally, starting with FT80X_IOC_CREATEDL and
* finishing the display list using FT80XIO_APPENDDL
* Argument: A reference to a display list structure instance. See
* struct ft80x_displaylist_s below.
* Returns: None
*
* This IOCTL command simply copies the display list as provided into the
* FT80x display list memory. Display lists should generally be formed as
* follows:
* FT80X_IOC_APPENDDL:
* Description: Write additional display list entries to the FT80x
* display list memory at the current display list offset.
* This IOCTL command permits display lists to be completed
* incrementally, starting with FT80X_IOC_CREATEDL and
* finishing display list using FT80XIO_APPENDDL.
* Argument: A reference to a display list structure instance. See
* struct ft80x_displaylist_s below.
* Returns: None
*
* These two IOCTL command simply copies the display list as provided into
* the FT80x display list memory. Display lists should generally be formed
* as follows:
*
* struct ft80x_cmd_dlstart_s dlstart; # Mark the start of the display list
* # Various display commands fillow...
* # Various display commands follow...
* FT80X_DISPLAY(); # Finish the last display
* struct ft80x_cmd_swap_s swap; # Swap to the new display list
*
* NOTE: This is the same functionality as the driver write() method. Either
* the write method or the FT80XIOC_PUTDISPLAYLIST IOCTL command can be used to
* write the display list.
* NOTE: The functionality of FT80X_IOC_CREATEDL is the equivalent to that of
* the driver write() method. Either the write method or the FT80X_IOC_CREATEDL
* IOCTL command can be used to write the display list.
*
* The difference between appending and create a display list using write()
* is that it is necessary to lseek() to the beginning of the display list
* to create a new display list. Subsequent writes will behave then append
* to the end of the display list.
*
* Output values from display commands are not automatically written back in
* either case but must be subsequently obtained using FT80XIOC_GETRESULT32.
* either case but must be subsequently obtained using FT80X_IOC_GETRESULT32.
*
* FT80XIOC_GETRESULT32:
* FT80X_IOC_GETRESULT32:
* Description: Read a 32-bit value from the display list.
* Argument: A reference to an instance of struct ft80x_result32_s below.
* Returns: The 32-bit value read from the display list.
*
* FT80XIOC_GETTRACKER:
* FT80X_IOC_GETTRACKER:
* Description: After CMD_TRACK has been issued, the coprocessor will update
* the TRACKER register with new position data.
* Argument: A pointer to a writable uint32_t memory location.
* Returns: The new content of the tracker register.
*/
#define FT80XIOC_PUTDISPLAYLIST _LCDIOC(FT80X_NIOCTL_BASE + 0)
#define FT80XIOC_GETRESULT32 _LCDIOC(FT80X_NIOCTL_BASE + 1)
#define FT80XIOC_GETTRACKER _LCDIOC(FT80X_NIOCTL_BASE + 2)
#define FT80X_IOC_CREATEDL _LCDIOC(FT80X_NIOCTL_BASE + 0)
#define FT80X_IOC_APPENDDL _LCDIOC(FT80X_NIOCTL_BASE + 1)
#define FT80X_IOC_GETRESULT32 _LCDIOC(FT80X_NIOCTL_BASE + 2)
#define FT80X_IOC_GETTRACKER _LCDIOC(FT80X_NIOCTL_BASE + 3)
/* Host commands. 3 word commands. The first word begins with 0b01, the next two are zero */
@ -993,8 +1013,8 @@ struct ft80x_cmd_translate_s
int32_t ty; /* 8: Y translate factor (b16) (input) */
};
/* This container structure is used by FT80XIOC_PUTDISPLAY and defines the
* list of display commands to be written into display list memory.
/* This container structure is used by FT80X_IOC_CREATEDL and FT80X_IOC_APPENDDL. It
* and defines the list of display commands to be written into display list memory.
*/
struct ft80x_displaylist_s
@ -1003,7 +1023,7 @@ struct ft80x_displaylist_s
struct ft80x_dlcmd_s cmd; /* First command in the display list (input) */
};
/* This structure is used with the FT80XIOC_GETRESULT32 IOCTL command to
/* This structure is used with the FT80X_IOC_GETRESULT32 IOCTL command to
* retrieve the result of the display list operation from display list memory.
*/