Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fbcon: add fbcon=margin:<color> command line option

This adds a new command line option to select the fbcon margin color.

The motivation for this is screens where black does not blend into the
physical surroundings of the screen. For example, using an LCD (not the
backlit kind), white text on a black background is hard to read, so
inverting the colors is preferred. However, when you do this, most of the
screen is filled with white but the margins are still filled with black.
This makes a big, black, backwards 'L' on the screen. By setting
fbcon=margin:7, the margins will be filled with white and the LCD looks as
expected.

Signed-off-by: David Lechner <david@lechnology.com>
[b.zolnierkie: ported over fbcon changes]
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>

authored by

David Lechner and committed by
Bartlomiej Zolnierkiewicz
74c1c8b3 16622a8e

+28 -11
+7
Documentation/fb/fbcon.txt
··· 148 148 Actually, the underlying fb driver is totally ignorant of console 149 149 rotation. 150 150 151 + 5. fbcon=margin:<color> 152 + 153 + This option specifies the color of the margins. The margins are the 154 + leftover area at the right and the bottom of the screen that are not 155 + used by text. By default, this area will be black. The 'color' value 156 + is 0 to 7 where 0 is black and 7 is white. 157 + 151 158 C. Attaching, Detaching and Unloading 152 159 153 160 Before going on how to attach, detach and unload the framebuffer console, an
+2 -2
drivers/video/fbdev/core/bitblit.c
··· 203 203 } 204 204 205 205 static void bit_clear_margins(struct vc_data *vc, struct fb_info *info, 206 - int bottom_only) 206 + int color, int bottom_only) 207 207 { 208 208 unsigned int cw = vc->vc_font.width; 209 209 unsigned int ch = vc->vc_font.height; ··· 213 213 unsigned int bs = info->var.yres - bh; 214 214 struct fb_fillrect region; 215 215 216 - region.color = 0; 216 + region.color = color; 217 217 region.rop = ROP_COPY; 218 218 219 219 if (rw && !bottom_only) {
+11 -1
drivers/video/fbdev/core/fbcon.c
··· 138 138 /* console rotation */ 139 139 static int initial_rotation = -1; 140 140 static int fbcon_has_sysfs; 141 + static int margin_color; 141 142 142 143 static const struct consw fb_con; 143 144 ··· 491 490 initial_rotation = simple_strtoul(options, &options, 0); 492 491 if (initial_rotation > 3) 493 492 initial_rotation = 0; 493 + continue; 494 + } 495 + 496 + if (!strncmp(options, "margin:", 7)) { 497 + options += 7; 498 + if (*options) 499 + margin_color = simple_strtoul(options, &options, 0); 500 + if (margin_color > 7) 501 + margin_color = 0; 494 502 continue; 495 503 } 496 504 } ··· 1316 1306 struct fbcon_ops *ops = info->fbcon_par; 1317 1307 1318 1308 if (!fbcon_is_inactive(vc, info)) 1319 - ops->clear_margins(vc, info, bottom_only); 1309 + ops->clear_margins(vc, info, margin_color, bottom_only); 1320 1310 } 1321 1311 1322 1312 static void fbcon_cursor(struct vc_data *vc, int mode)
+1 -1
drivers/video/fbdev/core/fbcon.h
··· 60 60 const unsigned short *s, int count, int yy, int xx, 61 61 int fg, int bg); 62 62 void (*clear_margins)(struct vc_data *vc, struct fb_info *info, 63 - int bottom_only); 63 + int color, int bottom_only); 64 64 void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode, 65 65 int softback_lines, int fg, int bg); 66 66 int (*update_start)(struct fb_info *info);
+2 -2
drivers/video/fbdev/core/fbcon_ccw.c
··· 189 189 } 190 190 191 191 static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info, 192 - int bottom_only) 192 + int color, int bottom_only) 193 193 { 194 194 unsigned int cw = vc->vc_font.width; 195 195 unsigned int ch = vc->vc_font.height; ··· 198 198 unsigned int bs = vc->vc_rows*ch; 199 199 struct fb_fillrect region; 200 200 201 - region.color = 0; 201 + region.color = color; 202 202 region.rop = ROP_COPY; 203 203 204 204 if (rw && !bottom_only) {
+2 -2
drivers/video/fbdev/core/fbcon_cw.c
··· 172 172 } 173 173 174 174 static void cw_clear_margins(struct vc_data *vc, struct fb_info *info, 175 - int bottom_only) 175 + int color, int bottom_only) 176 176 { 177 177 unsigned int cw = vc->vc_font.width; 178 178 unsigned int ch = vc->vc_font.height; ··· 181 181 unsigned int rs = info->var.yres - rw; 182 182 struct fb_fillrect region; 183 183 184 - region.color = 0; 184 + region.color = color; 185 185 region.rop = ROP_COPY; 186 186 187 187 if (rw && !bottom_only) {
+2 -2
drivers/video/fbdev/core/fbcon_ud.c
··· 220 220 } 221 221 222 222 static void ud_clear_margins(struct vc_data *vc, struct fb_info *info, 223 - int bottom_only) 223 + int color, int bottom_only) 224 224 { 225 225 unsigned int cw = vc->vc_font.width; 226 226 unsigned int ch = vc->vc_font.height; ··· 228 228 unsigned int bh = info->var.yres - (vc->vc_rows*ch); 229 229 struct fb_fillrect region; 230 230 231 - region.color = 0; 231 + region.color = color; 232 232 region.rop = ROP_COPY; 233 233 234 234 if (rw && !bottom_only) {
+1 -1
drivers/video/fbdev/core/tileblit.c
··· 74 74 } 75 75 76 76 static void tile_clear_margins(struct vc_data *vc, struct fb_info *info, 77 - int bottom_only) 77 + int color, int bottom_only) 78 78 { 79 79 return; 80 80 }