This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 65f80533051 lcd/ili9341: Improve putrun's checks
65f80533051 is described below
commit 65f80533051c81bff1adc33ab83f62fd67c0b3e9
Author: Jiri Vlasak <[email protected]>
AuthorDate: Fri Feb 6 00:37:43 2026 +0100
lcd/ili9341: Improve putrun's checks
Improve checks for the position outside of the LCD's area. Fix the input
when possible.
Slightly improve the documentation.
Signed-off-by: Jiri Vlasak <[email protected]>
---
drivers/lcd/ili9341.c | 58 ++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 7 deletions(-)
diff --git a/drivers/lcd/ili9341.c b/drivers/lcd/ili9341.c
index 820d23f690f..090d2361e39 100644
--- a/drivers/lcd/ili9341.c
+++ b/drivers/lcd/ili9341.c
@@ -562,17 +562,35 @@ static void ili9341_selectarea(FAR struct ili9341_lcd_s
*lcd,
*
* Input Parameters:
* lcd_dev - The lcd device
- * row - Starting row to write to (range: 0 <= row < yres)
- * col - Starting column to write to (range: 0 <= col <= xres-npixels)
+ * row - Row to write to (range: 0 <= row < yres)
+ * col - Starting column to write to (range: 0 <= col < xres)
* buffer - The buffer containing the run to be written to the LCD
- * npixels - The number of pixels to write to the
- * (range: 0 < npixels <= xres-col)
+ * npixels - The number of pixels to write to the LCD, limited by col
+ * (range: 1 <= npixels <= xres - col)
*
* Returned Value:
*
* On success - OK
* On error - -EINVAL
*
+ * NOTE: This procedure could be used as putarea's fallback when putarea is
+ * not implemented. In such a case, the input to the putarea, i.e.:
+ *
+ * - row_start (0 <= row_start < yres)
+ * - row_end (row_start <= row_end < yres)
+ * - col_start (0 <= col_start < xres)
+ * - col_end (col_start <= col_end < xres)
+ *
+ * needs to be converted to multiple calls to putrun:
+ *
+ * col = col_start;
+ * npixels = col_end - col_start + 1;
+ *
+ * for (row = row_start; row <= row_end; row++)
+ * {
+ * putrun(lcd_dev, row, col, buffer, npixels);
+ * }
+ *
****************************************************************************/
static int ili9341_putrun(FAR struct lcd_dev_s *lcd_dev, fb_coord_t row,
@@ -585,11 +603,37 @@ static int ili9341_putrun(FAR struct lcd_dev_s *lcd_dev,
fb_coord_t row,
DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0);
- /* Check if position outside of area */
+ /* Check if position outside of the LCD's area. Fix when possible. */
- if (col + npixels > ili9341_getxres(dev) || row > ili9341_getyres(dev))
+ if (row >= ili9341_getyres(dev))
{
- return -EINVAL;
+ lcderr("row >= yres: %d >= %d", row, ili9341_getyres(dev));
+ row = ili9341_getyres(dev) - 1;
+ lcdinfo("row set to %d", row);
+ }
+
+ if (npixels < 1)
+ {
+ lcderr("npixels needs to be at least one, it is %d", npixels);
+ npixels = 1;
+ lcdinfo("npixels set to %d", npixels);
+ }
+
+ if (col + npixels > ili9341_getxres(dev))
+ {
+ lcderr("col + npixels is %d but must be at most %d",
+ (col + npixels),
+ ili9341_getxres(dev));
+ npixels = ili9341_getxres(dev) - col;
+ if (npixels < 1)
+ {
+ lcderr("failed to fix npixels");
+ return -EINVAL;
+ }
+ else
+ {
+ lcdinfo("col is %d, npixels set to %d", col, npixels);
+ }
}
/* Select lcd driver */