1
2
3
4
5
6
7
8
9
10
11#ifndef _VIDEO_FBCON_H
12#define _VIDEO_FBCON_H
13
14#include <linux/types.h>
15#include <linux/vt_buffer.h>
16#include <linux/vt_kern.h>
17
18#include <asm/io.h>
19
20#define FBCON_FLAGS_INIT 1
21#define FBCON_FLAGS_CURSOR_TIMER 2
22
23
24
25
26
27
28struct display {
29
30 const u_char *fontdata;
31 int userfont;
32 u_short scrollmode;
33 u_short inverse;
34 short yscroll;
35 int vrows;
36 int cursor_shape;
37 int con_rotate;
38 u32 xres_virtual;
39 u32 yres_virtual;
40 u32 height;
41 u32 width;
42 u32 bits_per_pixel;
43 u32 grayscale;
44 u32 nonstd;
45 u32 accel_flags;
46 u32 rotate;
47 struct fb_bitfield red;
48 struct fb_bitfield green;
49 struct fb_bitfield blue;
50 struct fb_bitfield transp;
51 const struct fb_videomode *mode;
52};
53
54struct fbcon_ops {
55 void (*bmove)(struct vc_data *vc, struct fb_info *info, int sy,
56 int sx, int dy, int dx, int height, int width);
57 void (*clear)(struct vc_data *vc, struct fb_info *info, int sy,
58 int sx, int height, int width);
59 void (*putcs)(struct vc_data *vc, struct fb_info *info,
60 const unsigned short *s, int count, int yy, int xx,
61 int fg, int bg);
62 void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
63 int bottom_only);
64 void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
65 int softback_lines, int fg, int bg);
66 int (*update_start)(struct fb_info *info);
67 int (*rotate_font)(struct fb_info *info, struct vc_data *vc);
68 struct fb_var_screeninfo var;
69 struct timer_list cursor_timer;
70 struct fb_cursor cursor_state;
71 struct display *p;
72 int currcon;
73 int cursor_flash;
74 int cursor_reset;
75 int blank_state;
76 int graphics;
77 int save_graphics;
78 int flags;
79 int rotate;
80 int cur_rotate;
81 char *cursor_data;
82 u8 *fontbuffer;
83 u8 *fontdata;
84 u8 *cursor_src;
85 u32 cursor_size;
86 u32 fd_size;
87};
88
89
90
91
92
93#define attr_fgcol(fgshift,s) \
94 (((s) >> (fgshift)) & 0x0f)
95#define attr_bgcol(bgshift,s) \
96 (((s) >> (bgshift)) & 0x0f)
97
98
99#define attr_bold(s) \
100 ((s) & 0x200)
101#define attr_reverse(s) \
102 ((s) & 0x800)
103#define attr_underline(s) \
104 ((s) & 0x400)
105#define attr_blink(s) \
106 ((s) & 0x8000)
107
108
109static inline int mono_col(const struct fb_info *info)
110{
111 __u32 max_len;
112 max_len = max(info->var.green.length, info->var.red.length);
113 max_len = max(info->var.blue.length, max_len);
114 return (~(0xfff << max_len)) & 0xff;
115}
116
117static inline int attr_col_ec(int shift, struct vc_data *vc,
118 struct fb_info *info, int is_fg)
119{
120 int is_mono01;
121 int col;
122 int fg;
123 int bg;
124
125 if (!vc)
126 return 0;
127
128 if (vc->vc_can_do_color)
129 return is_fg ? attr_fgcol(shift,vc->vc_video_erase_char)
130 : attr_bgcol(shift,vc->vc_video_erase_char);
131
132 if (!info)
133 return 0;
134
135 col = mono_col(info);
136 is_mono01 = info->fix.visual == FB_VISUAL_MONO01;
137
138 if (attr_reverse(vc->vc_video_erase_char)) {
139 fg = is_mono01 ? col : 0;
140 bg = is_mono01 ? 0 : col;
141 }
142 else {
143 fg = is_mono01 ? 0 : col;
144 bg = is_mono01 ? col : 0;
145 }
146
147 return is_fg ? fg : bg;
148}
149
150#define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0)
151#define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1)
152
153
154#define REFCOUNT(fd) (((int *)(fd))[-1])
155#define FNTSIZE(fd) (((int *)(fd))[-2])
156#define FNTCHARCNT(fd) (((int *)(fd))[-3])
157#define FNTSUM(fd) (((int *)(fd))[-4])
158#define FONT_EXTRA_WORDS 4
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210#define SCROLL_MOVE 0x001
211#define SCROLL_PAN_MOVE 0x002
212#define SCROLL_WRAP_MOVE 0x003
213#define SCROLL_REDRAW 0x004
214#define SCROLL_PAN_REDRAW 0x005
215
216#ifdef CONFIG_FB_TILEBLITTING
217extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
218#endif
219extern void fbcon_set_bitops(struct fbcon_ops *ops);
220extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
221
222#define FBCON_ATTRIBUTE_UNDERLINE 1
223#define FBCON_ATTRIBUTE_REVERSE 2
224#define FBCON_ATTRIBUTE_BOLD 4
225
226static inline int real_y(struct display *p, int ypos)
227{
228 int rows = p->vrows;
229
230 ypos += p->yscroll;
231 return ypos < rows ? ypos : ypos - rows;
232}
233
234
235static inline int get_attribute(struct fb_info *info, u16 c)
236{
237 int attribute = 0;
238
239 if (fb_get_color_depth(&info->var, &info->fix) == 1) {
240 if (attr_underline(c))
241 attribute |= FBCON_ATTRIBUTE_UNDERLINE;
242 if (attr_reverse(c))
243 attribute |= FBCON_ATTRIBUTE_REVERSE;
244 if (attr_bold(c))
245 attribute |= FBCON_ATTRIBUTE_BOLD;
246 }
247
248 return attribute;
249}
250
251#define FBCON_SWAP(i,r,v) ({ \
252 typeof(r) _r = (r); \
253 typeof(v) _v = (v); \
254 (void) (&_r == &_v); \
255 (i == FB_ROTATE_UR || i == FB_ROTATE_UD) ? _r : _v; })
256
257#ifdef CONFIG_FRAMEBUFFER_CONSOLE_ROTATION
258extern void fbcon_set_rotate(struct fbcon_ops *ops);
259#else
260#define fbcon_set_rotate(x) do {} while(0)
261#endif
262
263#endif
264
265