* [RFC] WIP: fbconsole: very dirty font selection via param_enum
@ 2015-07-13 20:28 Antony Pavlov
2015-07-14 4:42 ` Sascha Hauer
2015-07-14 5:27 ` Sascha Hauer
0 siblings, 2 replies; 5+ messages in thread
From: Antony Pavlov @ 2015-07-13 20:28 UTC (permalink / raw)
To: barebox
Alas I can't find any tab-complition for param_enum,
so addition 'fonts' command is introduced.
Usage example:
==============
barebox@barebox sandbox:/ fonts
VGA8x16
MINI4x6
barebox@barebox sandbox:/ fbconsole0.font=MINI4x6
barebox@barebox sandbox:/ fbconsole0.active=o
fb0: framebuffer console 160x80 activated
barebox@barebox sandbox:/ fbconsole0.font=VGA8x16
Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
---
drivers/video/fbconsole.c | 55 +++++++++++++++++++++++++++++++++++++++++------
include/linux/font.h | 8 +++++++
lib/fonts/fonts.c | 44 +++++++++++++++++++++++++++++++++++++
3 files changed, 100 insertions(+), 7 deletions(-)
diff --git a/drivers/video/fbconsole.c b/drivers/video/fbconsole.c
index 36fd138..43a73d9 100644
--- a/drivers/video/fbconsole.c
+++ b/drivers/video/fbconsole.c
@@ -20,6 +20,10 @@ struct fbc_priv {
struct fb_info *fb;
struct screen *sc;
+
+ struct param_d *par_font;
+ int par_font_val;
+
/* FIXME */
#define VIDEO_FONT_CHARS 256
struct image *chars[VIDEO_FONT_CHARS];
@@ -47,6 +51,16 @@ static int fbc_tstc(struct console_device *cdev)
return 0;
}
+static void cls(struct fbc_priv *priv)
+{
+ void *buf = gui_screen_render_buffer(priv->sc);
+
+ memset(buf, 0, priv->fb->line_length * priv->fb->yres);
+
+ priv->x = 0;
+ priv->y = 0;
+}
+
static void drawchar(struct fbc_priv *priv, int x, int y, char c)
{
void *buf;
@@ -173,12 +187,7 @@ static void fbc_parse_csi(struct fbc_priv *priv)
}
if (*end == 'J' && a == 2 && b == -1) {
- void *buf = gui_screen_render_buffer(priv->sc);
-
- memset(buf, 0, priv->fb->line_length * priv->fb->yres);
-
- priv->x = 0;
- priv->y = 0;
+ cls(priv);
video_invertchar(priv, priv->x, priv->y);
}
@@ -270,7 +279,7 @@ static int fbc_set_active(struct console_device *cdev, unsigned flags)
struct fb_info *fb = priv->fb;
const struct font_desc *font;
- font = find_font("MINI4x6");
+ font = find_font(font_by_param_value(priv->par_font_val));
if (!font) {
return -ENOENT;
}
@@ -296,6 +305,33 @@ static int fbc_set_active(struct console_device *cdev, unsigned flags)
return 0;
}
+static int set_font(struct param_d *p, void *vpriv)
+{
+ struct fbc_priv *priv = vpriv;
+ struct console_device *cdev = &priv->cdev;
+
+ if (cdev->f_active & CONSOLE_STDOUT) {
+ struct fb_info *fb = priv->fb;
+ const struct font_desc *font;
+
+ cls(priv);
+
+ font = find_font(font_by_param_value(priv->par_font_val));
+
+ /* FIXME: code duplication */
+ priv->font_width = font->width;
+ priv->font_height = font->height;
+ priv->fontdata = font->data;
+
+ priv->rows = fb->yres / priv->font_height - 1;
+ priv->cols = fb->xres / priv->font_width - 1;
+
+ priv->state = LIT;
+ }
+
+ return 0;
+}
+
int register_fbconsole(struct fb_info *fb)
{
struct fbc_priv *priv;
@@ -325,6 +361,11 @@ int register_fbconsole(struct fb_info *fb)
return ret;
}
+ priv->par_font_val = 0;
+ priv->par_font = add_param_font(&cdev->class_dev,
+ set_font, NULL,
+ &priv->par_font_val, priv);
+
pr_info("registered as %s%d\n", cdev->class_dev.name, cdev->class_dev.id);
return 0;
diff --git a/include/linux/font.h b/include/linux/font.h
index 24d6355..4171c5c 100644
--- a/include/linux/font.h
+++ b/include/linux/font.h
@@ -11,6 +11,8 @@
#ifndef _VIDEO_FONT_H
#define _VIDEO_FONT_H
+#include <param.h>
+
struct font_desc {
const char *name;
int width, height;
@@ -26,4 +28,10 @@ extern const struct font_desc *find_font(const char *name);
/* Max. length for the name of a predefined font */
#define MAX_FONT_NAME 32
+extern struct param_d *add_param_font(struct device_d *dev,
+ int (*set)(struct param_d *p, void *priv),
+ int (*get)(struct param_d *p, void *priv),
+ int *value, void *priv);
+extern char *font_by_param_value(int value);
+
#endif /* _VIDEO_FONT_H */
diff --git a/lib/fonts/fonts.c b/lib/fonts/fonts.c
index dbd1813..528ee3c 100644
--- a/lib/fonts/fonts.c
+++ b/lib/fonts/fonts.c
@@ -61,6 +61,50 @@ const struct font_desc *find_font(const char *name)
EXPORT_SYMBOL(find_font);
+static char *font_names;
+
+char *font_by_param_value(int value)
+{
+ return ((char **)font_names)[value];
+}
+
+struct param_d *add_param_font(struct device_d *dev,
+ int (*set)(struct param_d *p, void *priv),
+ int (*get)(struct param_d *p, void *priv),
+ int *value, void *priv)
+{
+ unsigned int i;
+ int t = num_fonts;
+
+ font_names = xmalloc(sizeof(char *) * t);
+
+ for (i = 0; i < num_fonts; i++)
+ ((const char **)font_names)[i] = fonts[i]->name;
+
+ return dev_add_param_enum(dev, "font",
+ set, get, value,
+ (const char **)font_names, num_fonts, priv);
+}
+
MODULE_AUTHOR("James Simmons <jsimmons@users.sf.net>");
MODULE_DESCRIPTION("Console Fonts");
MODULE_LICENSE("GPL");
+
+#include <common.h>
+#include <command.h>
+
+static int do_fonts(int argc, char *argv[])
+{
+ unsigned int i;
+
+ for (i = 0; i < num_fonts; i++)
+ printf("%s\n", fonts[i]->name);
+
+ return COMMAND_SUCCESS;
+}
+
+BAREBOX_CMD_START(fonts)
+ .cmd = do_fonts,
+ BAREBOX_CMD_DESC("show framebuffer console compiled-in fonts list")
+ BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE)
+BAREBOX_CMD_END
--
2.1.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] WIP: fbconsole: very dirty font selection via param_enum
2015-07-13 20:28 [RFC] WIP: fbconsole: very dirty font selection via param_enum Antony Pavlov
@ 2015-07-14 4:42 ` Sascha Hauer
2015-07-14 9:56 ` Antony Pavlov
2015-07-14 5:27 ` Sascha Hauer
1 sibling, 1 reply; 5+ messages in thread
From: Sascha Hauer @ 2015-07-14 4:42 UTC (permalink / raw)
To: Antony Pavlov; +Cc: barebox
On Mon, Jul 13, 2015 at 11:28:09PM +0300, Antony Pavlov wrote:
> Alas I can't find any tab-complition for param_enum,
> so addition 'fonts' command is introduced.
There is no tab completion, but 'devinfo fbconsole0' will show the
different possibilities for the enum. Is that sufficient?
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] WIP: fbconsole: very dirty font selection via param_enum
2015-07-13 20:28 [RFC] WIP: fbconsole: very dirty font selection via param_enum Antony Pavlov
2015-07-14 4:42 ` Sascha Hauer
@ 2015-07-14 5:27 ` Sascha Hauer
2015-07-14 10:01 ` Antony Pavlov
1 sibling, 1 reply; 5+ messages in thread
From: Sascha Hauer @ 2015-07-14 5:27 UTC (permalink / raw)
To: Antony Pavlov; +Cc: barebox
On Mon, Jul 13, 2015 at 11:28:09PM +0300, Antony Pavlov wrote:
> Alas I can't find any tab-complition for param_enum,
> so addition 'fonts' command is introduced.
>
> Usage example:
> ==============
>
> barebox@barebox sandbox:/ fonts
> VGA8x16
> MINI4x6
> barebox@barebox sandbox:/ fbconsole0.font=MINI4x6
> barebox@barebox sandbox:/ fbconsole0.active=o
> fb0: framebuffer console 160x80 activated
> barebox@barebox sandbox:/ fbconsole0.font=VGA8x16
>
> Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
> ---
> drivers/video/fbconsole.c | 55 +++++++++++++++++++++++++++++++++++++++++------
> include/linux/font.h | 8 +++++++
> lib/fonts/fonts.c | 44 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 100 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/video/fbconsole.c b/drivers/video/fbconsole.c
> index 36fd138..43a73d9 100644
> --- a/drivers/video/fbconsole.c
> +++ b/drivers/video/fbconsole.c
> @@ -20,6 +20,10 @@ struct fbc_priv {
> struct fb_info *fb;
>
> struct screen *sc;
> +
> + struct param_d *par_font;
> + int par_font_val;
> +
> /* FIXME */
> #define VIDEO_FONT_CHARS 256
> struct image *chars[VIDEO_FONT_CHARS];
> @@ -47,6 +51,16 @@ static int fbc_tstc(struct console_device *cdev)
> return 0;
> }
>
> +static void cls(struct fbc_priv *priv)
> +{
> + void *buf = gui_screen_render_buffer(priv->sc);
> +
> + memset(buf, 0, priv->fb->line_length * priv->fb->yres);
> +
> + priv->x = 0;
> + priv->y = 0;
> +}
> +
> static void drawchar(struct fbc_priv *priv, int x, int y, char c)
> {
> void *buf;
> @@ -173,12 +187,7 @@ static void fbc_parse_csi(struct fbc_priv *priv)
> }
>
> if (*end == 'J' && a == 2 && b == -1) {
> - void *buf = gui_screen_render_buffer(priv->sc);
> -
> - memset(buf, 0, priv->fb->line_length * priv->fb->yres);
> -
> - priv->x = 0;
> - priv->y = 0;
> + cls(priv);
> video_invertchar(priv, priv->x, priv->y);
> }
>
> @@ -270,7 +279,7 @@ static int fbc_set_active(struct console_device *cdev, unsigned flags)
> struct fb_info *fb = priv->fb;
> const struct font_desc *font;
>
> - font = find_font("MINI4x6");
> + font = find_font(font_by_param_value(priv->par_font_val));
This find_font(font_by_param_value()) doesn't look very nice. I think
there should be a const struct font_desc *find_font_enum(int); or
similar which doesn't take the detour via the font name.
> if (!font) {
> return -ENOENT;
> }
> @@ -296,6 +305,33 @@ static int fbc_set_active(struct console_device *cdev, unsigned flags)
> return 0;
> }
>
> +static int set_font(struct param_d *p, void *vpriv)
> +{
> + struct fbc_priv *priv = vpriv;
> + struct console_device *cdev = &priv->cdev;
> +
> + if (cdev->f_active & CONSOLE_STDOUT) {
(CONSOLE_STDOUT | CONSOLE_ERR)
> + struct fb_info *fb = priv->fb;
> + const struct font_desc *font;
> +
> + cls(priv);
> +
> + font = find_font(font_by_param_value(priv->par_font_val));
> +
> + /* FIXME: code duplication */
> + priv->font_width = font->width;
> + priv->font_height = font->height;
> + priv->fontdata = font->data;
> +
> + priv->rows = fb->yres / priv->font_height - 1;
> + priv->cols = fb->xres / priv->font_width - 1;
> +
> + priv->state = LIT;
Is this correct? If we are in the middle of an escape sequence, why
should we leave it here?
> + }
> +
> + return 0;
> +}
> +
> int register_fbconsole(struct fb_info *fb)
> {
> struct fbc_priv *priv;
> @@ -325,6 +361,11 @@ int register_fbconsole(struct fb_info *fb)
> return ret;
> }
>
> + priv->par_font_val = 0;
> + priv->par_font = add_param_font(&cdev->class_dev,
> + set_font, NULL,
> + &priv->par_font_val, priv);
> +
> pr_info("registered as %s%d\n", cdev->class_dev.name, cdev->class_dev.id);
>
> return 0;
> diff --git a/include/linux/font.h b/include/linux/font.h
> index 24d6355..4171c5c 100644
> --- a/include/linux/font.h
> +++ b/include/linux/font.h
> @@ -11,6 +11,8 @@
> #ifndef _VIDEO_FONT_H
> #define _VIDEO_FONT_H
>
> +#include <param.h>
> +
> struct font_desc {
> const char *name;
> int width, height;
> @@ -26,4 +28,10 @@ extern const struct font_desc *find_font(const char *name);
> /* Max. length for the name of a predefined font */
> #define MAX_FONT_NAME 32
>
> +extern struct param_d *add_param_font(struct device_d *dev,
> + int (*set)(struct param_d *p, void *priv),
> + int (*get)(struct param_d *p, void *priv),
> + int *value, void *priv);
> +extern char *font_by_param_value(int value);
> +
> #endif /* _VIDEO_FONT_H */
> diff --git a/lib/fonts/fonts.c b/lib/fonts/fonts.c
> index dbd1813..528ee3c 100644
> --- a/lib/fonts/fonts.c
> +++ b/lib/fonts/fonts.c
> @@ -61,6 +61,50 @@ const struct font_desc *find_font(const char *name)
>
> EXPORT_SYMBOL(find_font);
>
> +static char *font_names;
> +
> +char *font_by_param_value(int value)
> +{
> + return ((char **)font_names)[value];
> +}
> +
> +struct param_d *add_param_font(struct device_d *dev,
> + int (*set)(struct param_d *p, void *priv),
> + int (*get)(struct param_d *p, void *priv),
> + int *value, void *priv)
> +{
> + unsigned int i;
> + int t = num_fonts;
> +
if (!font_names) {
> + font_names = xmalloc(sizeof(char *) * t);
> +
> + for (i = 0; i < num_fonts; i++)
> + ((const char **)font_names)[i] = fonts[i]->name;
}
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] WIP: fbconsole: very dirty font selection via param_enum
2015-07-14 4:42 ` Sascha Hauer
@ 2015-07-14 9:56 ` Antony Pavlov
0 siblings, 0 replies; 5+ messages in thread
From: Antony Pavlov @ 2015-07-14 9:56 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
On Tue, 14 Jul 2015 06:42:38 +0200
Sascha Hauer <s.hauer@pengutronix.de> wrote:
> On Mon, Jul 13, 2015 at 11:28:09PM +0300, Antony Pavlov wrote:
> > Alas I can't find any tab-complition for param_enum,
> > so addition 'fonts' command is introduced.
>
> There is no tab completion, but 'devinfo fbconsole0' will show the
> different possibilities for the enum. Is that sufficient?
It's sufficient. I'll drop the font command in the RFCv2 patch.
--
Best regards,
Antony Pavlov
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] WIP: fbconsole: very dirty font selection via param_enum
2015-07-14 5:27 ` Sascha Hauer
@ 2015-07-14 10:01 ` Antony Pavlov
0 siblings, 0 replies; 5+ messages in thread
From: Antony Pavlov @ 2015-07-14 10:01 UTC (permalink / raw)
To: Sascha Hauer; +Cc: barebox
On Tue, 14 Jul 2015 07:27:56 +0200
Sascha Hauer <s.hauer@pengutronix.de> wrote:
> On Mon, Jul 13, 2015 at 11:28:09PM +0300, Antony Pavlov wrote:
> > Alas I can't find any tab-complition for param_enum,
> > so addition 'fonts' command is introduced.
> >
> > Usage example:
> > ==============
> >
> > barebox@barebox sandbox:/ fonts
> > VGA8x16
> > MINI4x6
> > barebox@barebox sandbox:/ fbconsole0.font=MINI4x6
> > barebox@barebox sandbox:/ fbconsole0.active=o
> > fb0: framebuffer console 160x80 activated
> > barebox@barebox sandbox:/ fbconsole0.font=VGA8x16
> >
> > Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
> > ---
> > drivers/video/fbconsole.c | 55 +++++++++++++++++++++++++++++++++++++++++------
> > include/linux/font.h | 8 +++++++
> > lib/fonts/fonts.c | 44 +++++++++++++++++++++++++++++++++++++
> > 3 files changed, 100 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/video/fbconsole.c b/drivers/video/fbconsole.c
> > index 36fd138..43a73d9 100644
> > --- a/drivers/video/fbconsole.c
> > +++ b/drivers/video/fbconsole.c
> > @@ -20,6 +20,10 @@ struct fbc_priv {
> > struct fb_info *fb;
> >
> > struct screen *sc;
> > +
> > + struct param_d *par_font;
> > + int par_font_val;
> > +
> > /* FIXME */
> > #define VIDEO_FONT_CHARS 256
> > struct image *chars[VIDEO_FONT_CHARS];
> > @@ -47,6 +51,16 @@ static int fbc_tstc(struct console_device *cdev)
> > return 0;
> > }
> >
> > +static void cls(struct fbc_priv *priv)
> > +{
> > + void *buf = gui_screen_render_buffer(priv->sc);
> > +
> > + memset(buf, 0, priv->fb->line_length * priv->fb->yres);
> > +
> > + priv->x = 0;
> > + priv->y = 0;
> > +}
> > +
> > static void drawchar(struct fbc_priv *priv, int x, int y, char c)
> > {
> > void *buf;
> > @@ -173,12 +187,7 @@ static void fbc_parse_csi(struct fbc_priv *priv)
> > }
> >
> > if (*end == 'J' && a == 2 && b == -1) {
> > - void *buf = gui_screen_render_buffer(priv->sc);
> > -
> > - memset(buf, 0, priv->fb->line_length * priv->fb->yres);
> > -
> > - priv->x = 0;
> > - priv->y = 0;
> > + cls(priv);
> > video_invertchar(priv, priv->x, priv->y);
> > }
> >
> > @@ -270,7 +279,7 @@ static int fbc_set_active(struct console_device *cdev, unsigned flags)
> > struct fb_info *fb = priv->fb;
> > const struct font_desc *font;
> >
> > - font = find_font("MINI4x6");
> > + font = find_font(font_by_param_value(priv->par_font_val));
>
> This find_font(font_by_param_value()) doesn't look very nice. I think
> there should be a const struct font_desc *find_font_enum(int); or
> similar which doesn't take the detour via the font name.
I have fixed this in the RFCv2 patch.
Also I have dropped unused find_font() so some patch splitting&rebasing is necessary.
> > + if (cdev->f_active & CONSOLE_STDOUT) {
>
> (CONSOLE_STDOUT | CONSOLE_ERR)
fixed in RFCv2.
>
> > + struct fb_info *fb = priv->fb;
> > + const struct font_desc *font;
> > +
> > + cls(priv);
> > +
> > + font = find_font(font_by_param_value(priv->par_font_val));
> > +
> > + /* FIXME: code duplication */
> > + priv->font_width = font->width;
> > + priv->font_height = font->height;
> > + priv->fontdata = font->data;
> > +
> > + priv->rows = fb->yres / priv->font_height - 1;
> > + priv->cols = fb->xres / priv->font_width - 1;
> > +
> > + priv->state = LIT;
>
> Is this correct? If we are in the middle of an escape sequence, why
> should we leave it here?
I can't imagine this situation.
I have dropped it in RFCv2 anyway.
> > +struct param_d *add_param_font(struct device_d *dev,
> > + int (*set)(struct param_d *p, void *priv),
> > + int (*get)(struct param_d *p, void *priv),
> > + int *value, void *priv)
> > +{
> > + unsigned int i;
> > + int t = num_fonts;
> > +
>
> if (!font_names) {
> > + font_names = xmalloc(sizeof(char *) * t);
> > +
> > + for (i = 0; i < num_fonts; i++)
> > + ((const char **)font_names)[i] = fonts[i]->name;
> }
I have planned to add separate initcall for font_names initialization,
but font_names initialization in add_parm_font() looks better:
* it is simplier;
* it runs "on-demand" only.
I have fixed this in RFCv2 too.
--
Best regards,
Antony Pavlov
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-07-14 9:55 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-13 20:28 [RFC] WIP: fbconsole: very dirty font selection via param_enum Antony Pavlov
2015-07-14 4:42 ` Sascha Hauer
2015-07-14 9:56 ` Antony Pavlov
2015-07-14 5:27 ` Sascha Hauer
2015-07-14 10:01 ` Antony Pavlov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox