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 fbcon_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 color, int bottom_only);
64 void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
65 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 fbcon_display *p;
72 struct fb_info *info;
73 int currcon;
74 int cur_blink_jiffies;
75 int cursor_flash;
76 int cursor_reset;
77 int blank_state;
78 int graphics;
79 int save_graphics;
80 int flags;
81 int rotate;
82 int cur_rotate;
83 char *cursor_data;
84 u8 *fontbuffer;
85 u8 *fontdata;
86 u8 *cursor_src;
87 u32 cursor_size;
88 u32 fd_size;
89};
90
91
92
93
94
95#define attr_fgcol(fgshift,s) \
96 (((s) >> (fgshift)) & 0x0f)
97#define attr_bgcol(bgshift,s) \
98 (((s) >> (bgshift)) & 0x0f)
99
100
101#define attr_bold(s) \
102 ((s) & 0x200)
103#define attr_reverse(s) \
104 ((s) & 0x800)
105#define attr_underline(s) \
106 ((s) & 0x400)
107#define attr_blink(s) \
108 ((s) & 0x8000)
109
110
111static inline int mono_col(const struct fb_info *info)
112{
113 __u32 max_len;
114 max_len = max(info->var.green.length, info->var.red.length);
115 max_len = max(info->var.blue.length, max_len);
116 return (~(0xfff << max_len)) & 0xff;
117}
118
119static inline int attr_col_ec(int shift, struct vc_data *vc,
120 struct fb_info *info, int is_fg)
121{
122 int is_mono01;
123 int col;
124 int fg;
125 int bg;
126
127 if (!vc)
128 return 0;
129
130 if (vc->vc_can_do_color)
131 return is_fg ? attr_fgcol(shift,vc->vc_video_erase_char)
132 : attr_bgcol(shift,vc->vc_video_erase_char);
133
134 if (!info)
135 return 0;
136
137 col = mono_col(info);
138 is_mono01 = info->fix.visual == FB_VISUAL_MONO01;
139
140 if (attr_reverse(vc->vc_video_erase_char)) {
141 fg = is_mono01 ? col : 0;
142 bg = is_mono01 ? 0 : col;
143 }
144 else {
145 fg = is_mono01 ? 0 : col;
146 bg = is_mono01 ? col : 0;
147 }
148
149 return is_fg ? fg : bg;
150}
151
152#define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0)
153#define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1)
154
155
156
157
158
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#define SCROLL_MOVE 0x001
206#define SCROLL_PAN_MOVE 0x002
207#define SCROLL_WRAP_MOVE 0x003
208#define SCROLL_REDRAW 0x004
209#define SCROLL_PAN_REDRAW 0x005
210
211#ifdef CONFIG_FB_TILEBLITTING
212extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
213#endif
214extern void fbcon_set_bitops(struct fbcon_ops *ops);
215extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
216
217#define FBCON_ATTRIBUTE_UNDERLINE 1
218#define FBCON_ATTRIBUTE_REVERSE 2
219#define FBCON_ATTRIBUTE_BOLD 4
220
221static inline int real_y(struct fbcon_display *p, int ypos)
222{
223 int rows = p->vrows;
224
225 ypos += p->yscroll;
226 return ypos < rows ? ypos : ypos - rows;
227}
228
229
230static inline int get_attribute(struct fb_info *info, u16 c)
231{
232 int attribute = 0;
233
234 if (fb_get_color_depth(&info->var, &info->fix) == 1) {
235 if (attr_underline(c))
236 attribute |= FBCON_ATTRIBUTE_UNDERLINE;
237 if (attr_reverse(c))
238 attribute |= FBCON_ATTRIBUTE_REVERSE;
239 if (attr_bold(c))
240 attribute |= FBCON_ATTRIBUTE_BOLD;
241 }
242
243 return attribute;
244}
245
246#define FBCON_SWAP(i,r,v) ({ \
247 typeof(r) _r = (r); \
248 typeof(v) _v = (v); \
249 (void) (&_r == &_v); \
250 (i == FB_ROTATE_UR || i == FB_ROTATE_UD) ? _r : _v; })
251
252#ifdef CONFIG_FRAMEBUFFER_CONSOLE_ROTATION
253extern void fbcon_set_rotate(struct fbcon_ops *ops);
254#else
255#define fbcon_set_rotate(x) do {} while(0)
256#endif
257
258#endif
259