From: poeschel@lemonage.de
To: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>,
Willy Tarreau <willy@haproxy.com>,
Ksenija Stanojevic <ksenija.stanojevic@gmail.com>,
linux-kernel@vger.kernel.org (open list)
Cc: Lars Poeschel <poeschel@lemonage.de>, Willy Tarreau <w@1wt.eu>
Subject: [PATCH v6 17/25] auxdisplay: Move char redefine code to hd44780_common
Date: Tue, 3 Nov 2020 10:58:20 +0100 [thread overview]
Message-ID: <20201103095828.515831-18-poeschel@lemonage.de> (raw)
In-Reply-To: <20201103095828.515831-1-poeschel@lemonage.de>
From: Lars Poeschel <poeschel@lemonage.de>
Take the code to redefine characters out of charlcd and move it to
hd44780_common, as this is hd44780 specific.
There is now a function hd44780_common_redefine_char that drivers use
and charlcd calls it through its ops function pointer.
Reviewed-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
---
Changes in v5:
- I did previously undo commit 3f03b6498 which was a mistake. This is
now corrected.
---
drivers/auxdisplay/charlcd.c | 60 +++--------------------------
drivers/auxdisplay/charlcd.h | 2 +
drivers/auxdisplay/hd44780.c | 2 +
drivers/auxdisplay/hd44780_common.c | 57 +++++++++++++++++++++++++++
drivers/auxdisplay/hd44780_common.h | 1 +
drivers/auxdisplay/panel.c | 3 ++
6 files changed, 70 insertions(+), 55 deletions(-)
diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c
index 29737c3e18f6..dca1b138a239 100644
--- a/drivers/auxdisplay/charlcd.c
+++ b/drivers/auxdisplay/charlcd.c
@@ -25,8 +25,6 @@
/* Keep the backlight on this many seconds for each flash */
#define LCD_BL_TEMPO_PERIOD 4
-#define LCD_CMD_SET_CGRAM_ADDR 0x40 /* Set char generator RAM address */
-
#define LCD_ESCAPE_LEN 24 /* Max chars for LCD escape command */
#define LCD_ESCAPE_CHAR 27 /* Use char 27 for escape command */
@@ -344,61 +342,13 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
LCD_FLAG_C | LCD_FLAG_B;
processed = 1;
break;
- case 'G': {
- /* Generator : LGcxxxxx...xx; must have <c> between '0'
- * and '7', representing the numerical ASCII code of the
- * redefined character, and <xx...xx> a sequence of 16
- * hex digits representing 8 bytes for each character.
- * Most LCDs will only use 5 lower bits of the 7 first
- * bytes.
- */
-
- unsigned char cgbytes[8];
- unsigned char cgaddr;
- int cgoffset;
- int shift;
- char value;
- int addr;
-
- if (!strchr(esc, ';'))
- break;
-
- esc++;
-
- cgaddr = *(esc++) - '0';
- if (cgaddr > 7) {
+ case 'G':
+ if (lcd->ops->redefine_char)
+ processed = lcd->ops->redefine_char(lcd, esc);
+ else
processed = 1;
- break;
- }
-
- cgoffset = 0;
- shift = 0;
- value = 0;
- while (*esc && cgoffset < 8) {
- int half;
-
- shift ^= 4;
-
- half = hex_to_bin(*esc++);
- if (half < 0)
- continue;
-
- value |= half << shift;
- if (shift == 0) {
- cgbytes[cgoffset++] = value;
- value = 0;
- }
- }
-
- hdc->write_cmd(hdc, LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8));
- for (addr = 0; addr < cgoffset; addr++)
- hdc->write_data(hdc, cgbytes[addr]);
-
- /* ensures that we stop writing to CGRAM */
- lcd->ops->gotoxy(lcd);
- processed = 1;
break;
- }
+
case 'x': /* gotoxy : LxXXX[yYYY]; */
case 'y': /* gotoxy : LyYYY[xXXX]; */
if (priv->esc_seq.buf[priv->esc_seq.len - 1] != ';')
diff --git a/drivers/auxdisplay/charlcd.h b/drivers/auxdisplay/charlcd.h
index 5a89bdeb659a..3339e8c2554e 100644
--- a/drivers/auxdisplay/charlcd.h
+++ b/drivers/auxdisplay/charlcd.h
@@ -75,6 +75,7 @@ struct charlcd {
* @cursor: Turn cursor on or off.
* @blink: Turn cursor blink on or off.
* @lines: One or two lines.
+ * @redefine_char: Redefine the actual pixel matrix of character.
*/
struct charlcd_ops {
void (*clear_fast)(struct charlcd *lcd);
@@ -91,6 +92,7 @@ struct charlcd_ops {
int (*blink)(struct charlcd *lcd, enum charlcd_onoff on);
int (*fontsize)(struct charlcd *lcd, enum charlcd_fontsize size);
int (*lines)(struct charlcd *lcd, enum charlcd_lines lines);
+ int (*redefine_char)(struct charlcd *lcd, char *esc);
};
void charlcd_backlight(struct charlcd *lcd, enum charlcd_onoff on);
diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c
index 7b7b28d72198..2e5e7c993933 100644
--- a/drivers/auxdisplay/hd44780.c
+++ b/drivers/auxdisplay/hd44780.c
@@ -138,6 +138,7 @@ static const struct charlcd_ops hd44780_ops_gpio8 = {
.blink = hd44780_common_blink,
.fontsize = hd44780_common_fontsize,
.lines = hd44780_common_lines,
+ .redefine_char = hd44780_common_redefine_char,
};
/* Send a command to the LCD panel in 4 bit GPIO mode */
@@ -193,6 +194,7 @@ static const struct charlcd_ops hd44780_ops_gpio4 = {
.blink = hd44780_common_blink,
.fontsize = hd44780_common_fontsize,
.lines = hd44780_common_lines,
+ .redefine_char = hd44780_common_redefine_char,
};
static int hd44780_probe(struct platform_device *pdev)
diff --git a/drivers/auxdisplay/hd44780_common.c b/drivers/auxdisplay/hd44780_common.c
index 9d538fdcd260..c528fb8e8808 100644
--- a/drivers/auxdisplay/hd44780_common.c
+++ b/drivers/auxdisplay/hd44780_common.c
@@ -26,6 +26,8 @@
#define LCD_CMD_TWO_LINES 0x08 /* Set to two display lines */
#define LCD_CMD_FONT_5X10_DOTS 0x04 /* Set char font to 5x10 dots */
+#define LCD_CMD_SET_CGRAM_ADDR 0x40 /* Set char generator RAM address */
+
#define LCD_CMD_SET_DDRAM_ADDR 0x80 /* Set display data RAM address */
/* sleeps that many milliseconds with a reschedule */
@@ -289,6 +291,61 @@ int hd44780_common_lines(struct charlcd *lcd, enum charlcd_lines lines)
}
EXPORT_SYMBOL_GPL(hd44780_common_lines);
+int hd44780_common_redefine_char(struct charlcd *lcd, char *esc)
+{
+ /* Generator : LGcxxxxx...xx; must have <c> between '0'
+ * and '7', representing the numerical ASCII code of the
+ * redefined character, and <xx...xx> a sequence of 16
+ * hex digits representing 8 bytes for each character.
+ * Most LCDs will only use 5 lower bits of the 7 first
+ * bytes.
+ */
+
+ struct hd44780_common *hdc = lcd->drvdata;
+ unsigned char cgbytes[8];
+ unsigned char cgaddr;
+ int cgoffset;
+ int shift;
+ char value;
+ int addr;
+
+ if (!strchr(esc, ';'))
+ return 0;
+
+ esc++;
+
+ cgaddr = *(esc++) - '0';
+ if (cgaddr > 7)
+ return 1;
+
+ cgoffset = 0;
+ shift = 0;
+ value = 0;
+ while (*esc && cgoffset < 8) {
+ int half;
+
+ shift ^= 4;
+ half = hex_to_bin(*esc++);
+ if (half < 0)
+ continue;
+
+ value |= half << shift;
+ if (shift == 0) {
+ cgbytes[cgoffset++] = value;
+ value = 0;
+ }
+ }
+
+ hdc->write_cmd(hdc, LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8));
+ for (addr = 0; addr < cgoffset; addr++)
+ hdc->write_data(hdc, cgbytes[addr]);
+
+ /* ensures that we stop writing to CGRAM */
+ lcd->ops->gotoxy(lcd);
+ return 1;
+}
+EXPORT_SYMBOL_GPL(hd44780_common_redefine_char);
+
struct hd44780_common *hd44780_common_alloc(void)
{
struct hd44780_common *hd;
diff --git a/drivers/auxdisplay/hd44780_common.h b/drivers/auxdisplay/hd44780_common.h
index e5a69fdc3b61..bc817d1610d4 100644
--- a/drivers/auxdisplay/hd44780_common.h
+++ b/drivers/auxdisplay/hd44780_common.h
@@ -29,4 +29,5 @@ int hd44780_common_cursor(struct charlcd *lcd, enum charlcd_onoff on);
int hd44780_common_blink(struct charlcd *lcd, enum charlcd_onoff on);
int hd44780_common_fontsize(struct charlcd *lcd, enum charlcd_fontsize size);
int hd44780_common_lines(struct charlcd *lcd, enum charlcd_lines lines);
+int hd44780_common_redefine_char(struct charlcd *lcd, char *esc);
struct hd44780_common *hd44780_common_alloc(void);
diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c
index 3d33d7cc979c..b0d2ae5b9be8 100644
--- a/drivers/auxdisplay/panel.c
+++ b/drivers/auxdisplay/panel.c
@@ -886,6 +886,7 @@ static const struct charlcd_ops charlcd_serial_ops = {
.blink = hd44780_common_blink,
.fontsize = hd44780_common_fontsize,
.lines = hd44780_common_lines,
+ .redefine_char = hd44780_common_redefine_char,
};
static const struct charlcd_ops charlcd_parallel_ops = {
@@ -902,6 +903,7 @@ static const struct charlcd_ops charlcd_parallel_ops = {
.blink = hd44780_common_blink,
.fontsize = hd44780_common_fontsize,
.lines = hd44780_common_lines,
+ .redefine_char = hd44780_common_redefine_char,
};
static const struct charlcd_ops charlcd_tilcd_ops = {
@@ -918,6 +920,7 @@ static const struct charlcd_ops charlcd_tilcd_ops = {
.blink = hd44780_common_blink,
.fontsize = hd44780_common_fontsize,
.lines = hd44780_common_lines,
+ .redefine_char = hd44780_common_redefine_char,
};
/* initialize the LCD driver */
--
2.28.0
next prev parent reply other threads:[~2020-11-03 9:59 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-03 9:58 [PATCH v6 00/25] Make charlcd device independent poeschel
2020-11-03 9:58 ` [PATCH v6 01/25] auxdisplay: Use an enum for charlcd backlight on/off ops poeschel
2020-11-03 9:58 ` [PATCH v6 02/25] auxdisplay: Introduce hd44780_common.[ch] poeschel
2020-11-03 9:58 ` [PATCH v6 03/25] auxdisplay: Move hwidth and bwidth to struct hd44780_common poeschel
2020-11-03 9:58 ` [PATCH v6 04/25] auxdisplay: Move ifwidth " poeschel
2020-11-03 9:58 ` [PATCH v6 05/25] auxdisplay: Move write_data pointer to hd44780_common poeschel
2020-11-03 9:58 ` [PATCH v6 06/25] auxdisplay: Move write_cmd pointers to hd44780 drivers poeschel
2020-11-03 9:58 ` [PATCH v6 07/25] auxdisplay: Move addr out of charlcd_priv poeschel
2020-11-03 9:58 ` [PATCH v6 08/25] auxdisplay: hd44780_common_print poeschel
2020-11-03 9:58 ` [PATCH v6 09/25] auxdisplay: provide hd44780_common_gotoxy poeschel
2020-11-03 9:58 ` [PATCH v6 10/25] auxdisplay: add home to charlcd_ops poeschel
2020-11-03 9:58 ` [PATCH v6 11/25] auxdisplay: Move clear_display to hd44780_common poeschel
2020-11-03 9:58 ` [PATCH v6 12/25] auxdisplay: make charlcd_backlight visible " poeschel
2020-11-03 9:58 ` [PATCH v6 13/25] auxdisplay: Make use of enum for backlight on / off poeschel
2020-11-03 9:58 ` [PATCH v6 14/25] auxdisplay: Move init_display to hd44780_common poeschel
2020-11-03 9:58 ` [PATCH v6 15/25] auxdisplay: implement various hd44780_common_ functions poeschel
2020-11-03 9:58 ` [PATCH v6 16/25] auxdisplay: cleanup unnecessary hd44780 code in charlcd poeschel
2020-11-03 9:58 ` poeschel [this message]
2020-11-03 9:58 ` [PATCH v6 18/25] auxdisplay: Call charlcd_backlight in place poeschel
2020-11-03 9:58 ` [PATCH v6 19/25] auxdisplay: hd44780_common: Reduce clear_display timeout poeschel
2020-11-03 9:58 ` [PATCH v6 20/25] auxdisplay: hd44780: Remove clear_fast poeschel
2020-11-03 9:58 ` [PATCH v6 21/25] auxdisplay: charlcd: replace last device specific stuff poeschel
2020-11-03 9:58 ` [PATCH v6 22/25] auxdisplay: Change gotoxy calling interface poeschel
2020-11-03 9:58 ` [PATCH v6 23/25] auxdisplay: charlcd: Do not print chars at end of line poeschel
2020-11-03 9:58 ` [PATCH v6 24/25] auxdisplay: lcd2s DT binding doc poeschel
2020-11-03 9:58 ` [PATCH v6 25/25] auxdisplay: add a driver for lcd2s character display poeschel
2020-11-04 13:30 ` [PATCH v6 00/25] Make charlcd device independent Miguel Ojeda
2020-11-06 10:11 ` Lars Poeschel
2020-11-06 12:17 ` Miguel Ojeda
2020-11-06 16:35 ` Randy Dunlap
2020-11-09 9:31 ` [PATCH] auxdisplay: hd44780_common: Fix build error poeschel
2020-11-09 9:45 ` Miguel Ojeda
2020-11-09 17:30 ` Randy Dunlap
2020-11-09 9:53 ` [PATCH v6 00/25] Make charlcd device independent Miguel Ojeda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201103095828.515831-18-poeschel@lemonage.de \
--to=poeschel@lemonage.de \
--cc=ksenija.stanojevic@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=miguel.ojeda.sandonis@gmail.com \
--cc=w@1wt.eu \
--cc=willy@haproxy.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).