mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2024-06-02 04:46:16 +02:00
c41da167d2
All patches automatically rebased. Build system: x86_64 Build-tested: bcm2711/RPi4B, mt7622/RT3200 Run-tested: bcm2711/RPi4B, mt7622/RT3200 Signed-off-by: John Audia <graysky@archlinux.us>
106 lines
3.1 KiB
Diff
106 lines
3.1 KiB
Diff
From b279b2516d9fc40cc491b142fbf453f9533f6e4f Mon Sep 17 00:00:00 2001
|
|
From: Phil Elwell <phil@raspberrypi.com>
|
|
Date: Fri, 19 Feb 2021 10:25:01 +0000
|
|
Subject: [PATCH] staging: fbtft: Add minipitft13 variant
|
|
|
|
The Adafruit Mini-PiTFT13 display needs offsets applying when rotated,
|
|
so use the "variant" mechanism to select a custom set_addr_win method
|
|
using a dedicated compatible string of "fbtft,minipitft13".
|
|
|
|
See: https://github.com/raspberrypi/firmware/issues/1524
|
|
|
|
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|
---
|
|
drivers/staging/fbtft/fb_st7789v.c | 45 +++++++++++++++++++++++++++++-
|
|
1 file changed, 44 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/staging/fbtft/fb_st7789v.c
|
|
+++ b/drivers/staging/fbtft/fb_st7789v.c
|
|
@@ -66,6 +66,12 @@ enum st7789v_command {
|
|
#define MADCTL_MX BIT(6) /* bitmask for column address order */
|
|
#define MADCTL_MY BIT(7) /* bitmask for page address order */
|
|
|
|
+static u32 col_offset = 0;
|
|
+static u32 row_offset = 0;
|
|
+static u8 col_hack_fix_offset = 0;
|
|
+static short x_offset = 0;
|
|
+static short y_offset = 0;
|
|
+
|
|
/**
|
|
* init_display() - initialize the display controller
|
|
*
|
|
@@ -147,6 +153,22 @@ static int init_display(struct fbtft_par
|
|
return 0;
|
|
}
|
|
|
|
+static void minipitft13_set_addr_win(struct fbtft_par *par, int xs, int ys,
|
|
+ int xe, int ye)
|
|
+{
|
|
+ xs += x_offset;
|
|
+ xe += x_offset;
|
|
+ ys += y_offset;
|
|
+ ye += y_offset;
|
|
+ write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS,
|
|
+ xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
|
|
+
|
|
+ write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS,
|
|
+ ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
|
|
+
|
|
+ write_reg(par, MIPI_DCS_WRITE_MEMORY_START);
|
|
+}
|
|
+
|
|
/**
|
|
* set_var() - apply LCD properties like rotation and BGR mode
|
|
*
|
|
@@ -157,20 +179,32 @@ static int init_display(struct fbtft_par
|
|
static int set_var(struct fbtft_par *par)
|
|
{
|
|
u8 madctl_par = 0;
|
|
+ struct fbtft_display *display = &par->pdata->display;
|
|
+ u32 width = display->width;
|
|
+ u32 height = display->height;
|
|
|
|
if (par->bgr)
|
|
madctl_par |= MADCTL_BGR;
|
|
switch (par->info->var.rotate) {
|
|
case 0:
|
|
+ x_offset = 0;
|
|
+ y_offset = 0;
|
|
break;
|
|
case 90:
|
|
madctl_par |= (MADCTL_MV | MADCTL_MY);
|
|
+ x_offset = (320 - height) - row_offset;
|
|
+ y_offset = (240 - width) - col_offset;
|
|
break;
|
|
case 180:
|
|
madctl_par |= (MADCTL_MX | MADCTL_MY);
|
|
+ x_offset = (240 - width) - col_offset + col_hack_fix_offset;
|
|
+ // hack tweak to account for extra pixel width to make even
|
|
+ y_offset = (320 - height) - row_offset;
|
|
break;
|
|
case 270:
|
|
madctl_par |= (MADCTL_MV | MADCTL_MX);
|
|
+ x_offset = row_offset;
|
|
+ y_offset = col_offset;
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
@@ -267,7 +301,16 @@ static struct fbtft_display display = {
|
|
},
|
|
};
|
|
|
|
-FBTFT_REGISTER_DRIVER(DRVNAME, "sitronix,st7789v", &display);
|
|
+int variant_minipitft13(struct fbtft_display *display)
|
|
+{
|
|
+ display->fbtftops.set_addr_win = minipitft13_set_addr_win;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+FBTFT_REGISTER_DRIVER_START(&display)
|
|
+FBTFT_COMPATIBLE("sitronix,st7789v")
|
|
+FBTFT_VARIANT_COMPATIBLE("fbtft,minipitft13", variant_minipitft13)
|
|
+FBTFT_REGISTER_DRIVER_END(DRVNAME, &display);
|
|
|
|
MODULE_ALIAS("spi:" DRVNAME);
|
|
MODULE_ALIAS("platform:" DRVNAME);
|