19
19
*
20
20
*/
21
21
22
- #include <stdio.h>
23
- #include <stdlib.h>
24
- #include <unistd.h>
25
- #include <fcntl.h>
26
- #include <linux/fb.h>
27
- #include <linux/kd.h>
28
- #include <sys/mman.h>
29
- #include <sys/stat.h>
30
- #include <sys/types.h>
31
- #include <sys/ioctl.h>
32
- #include "base/lcd.h"
22
+ #include "fb_info.h"
33
23
#include "tkc/mem.h"
24
+ #include "base/lcd.h"
25
+ #include "lcd_mem_others.h"
34
26
#include "lcd/lcd_mem_bgr565.h"
35
27
#include "lcd/lcd_mem_bgra8888.h"
36
28
#include "lcd/lcd_mem_rgba8888.h"
37
29
38
- typedef struct _fb_info_t {
39
- int fd ;
40
- void * bits ;
41
- struct fb_fix_screeninfo fix ;
42
- struct fb_var_screeninfo var ;
43
- } fb_info_t ;
44
-
45
- #define fb_width (fb ) ((fb)->var.xres)
46
- #define fb_height (fb ) ((fb)->var.yres)
47
- #define fb_size (fb ) ((fb)->var.yres * (fb)->fix.line_length)
48
-
49
- #ifndef FBIO_WAITFORVSYNC
50
- #define FBIO_WAITFORVSYNC _IOW('F', 0x20, u_int32_t)
51
- #endif /*FBIO_WAITFORVSYNC*/
52
-
53
- static int fb_open (fb_info_t * fb , const char * filename ) {
54
- uint32_t size = 0 ;
55
- fb -> fd = open (filename , O_RDWR );
56
- if (fb -> fd < 0 ) {
57
- return -1 ;
58
- }
59
-
60
- if (ioctl (fb -> fd , FBIOGET_FSCREENINFO , & fb -> fix ) < 0 ) goto fail ;
61
- if (ioctl (fb -> fd , FBIOGET_VSCREENINFO , & fb -> var ) < 0 ) goto fail ;
62
-
63
- fb -> var .xoffset = 0 ;
64
- fb -> var .yoffset = 0 ;
65
- ioctl (fb -> fd , FBIOPAN_DISPLAY , & (fb -> var ));
66
-
67
- log_debug ("fb_info_t: %s\n" , filename );
68
- log_debug ("fb_info_t: xres=%d yres=%d bits_per_pixel=%d mem_size=%d\n" , fb -> var .xres ,
69
- fb -> var .yres , fb -> var .bits_per_pixel , fb_size (fb ));
70
- log_debug ("fb_info_t: red(%d %d) green(%d %d) blue(%d %d)\n" , fb -> var .red .offset ,
71
- fb -> var .red .length , fb -> var .green .offset , fb -> var .green .length , fb -> var .blue .offset ,
72
- fb -> var .blue .length );
73
-
74
- size = fb_size (fb );
75
- #ifdef FTK_FB_NOMMAP
76
- // uclinux doesn't support MAP_SHARED or MAP_PRIVATE with PROT_WRITE, so no mmap at all is simpler
77
- fb -> bits = fb -> fix .smem_start ;
78
- #else
79
- fb -> bits = mmap (0 , size , PROT_READ | PROT_WRITE , MAP_SHARED , fb -> fd , 0 );
80
- #endif
81
-
82
- if (fb -> bits == MAP_FAILED ) {
83
- log_debug ("map framebuffer failed.\n" );
84
- goto fail ;
85
- }
86
-
87
- memset (fb -> bits , 0xff , size );
88
-
89
- log_debug ("line_length=%d mem_size=%d\n" , fb -> fix .line_length , fb_size (fb ));
90
- log_debug ("xres_virtual =%d yres_virtual=%d xpanstep=%d ywrapstep=%d\n" , fb -> var .xres_virtual ,
91
- fb -> var .yres_virtual , fb -> fix .xpanstep , fb -> fix .ywrapstep );
92
-
93
- return 0 ;
94
- fail :
95
- log_debug ("%s is not a framebuffer.\n" , filename );
96
- close (fb -> fd );
97
-
98
- return -1 ;
99
- }
100
-
101
- static void fb_close (fb_info_t * fb ) {
102
- if (fb != NULL ) {
103
- munmap (fb -> bits , fb_size (fb ));
104
- close (fb -> fd );
105
- }
106
-
107
- return ;
108
- }
109
-
110
- static void fb_sync (fb_info_t * info ) {
111
- int ret = 0 ;
112
- int zero = 0 ;
113
- ret = ioctl (info -> fd , FBIO_WAITFORVSYNC , & zero );
114
-
115
- log_debug ("FBIO_WAITFORVSYNC: %d %d\n" , ret , zero );
116
-
117
- return ;
118
- }
119
-
120
30
static fb_info_t s_fb ;
121
31
static lcd_flush_t s_lcd_flush_default = NULL ;
122
32
@@ -138,42 +48,51 @@ static void on_app_exit(void) {
138
48
fb_close (fb );
139
49
}
140
50
51
+ static lcd_t * lcd_linux_create (fb_info_t * fb ) {
52
+ lcd_t * lcd = NULL ;
53
+ int w = fb_width (fb );
54
+ int h = fb_height (fb );
55
+ int line_length = fb -> fix .line_length ;
56
+
57
+ int size = fb_size (fb );
58
+ int bpp = fb -> var .bits_per_pixel ;
59
+ uint8_t * online_fb = (uint8_t * )(fb -> bits );
60
+ struct fb_var_screeninfo * var = & (fb -> var );
61
+
62
+ if (bpp == 16 ) {
63
+ if (var -> transp .length == 1 && var -> red .length == 5 && var -> green .length == 5 &&
64
+ var -> blue .length == 5 && var -> blue .offset == 0 ) {
65
+ lcd = lcd_mem_bgra5551_create (fb );
66
+ } else {
67
+ s_offline_fb = (uint8_t * )malloc (size );
68
+ lcd = lcd_mem_bgr565_create_double_fb (w , h , online_fb , s_offline_fb );
69
+ }
70
+ } else if (bpp == 32 ) {
71
+ if (fb -> var .blue .offset == 0 ) {
72
+ s_offline_fb = (uint8_t * )malloc (size );
73
+ lcd = lcd_mem_bgra8888_create_double_fb (w , h , online_fb , s_offline_fb );
74
+ } else {
75
+ s_offline_fb = (uint8_t * )malloc (size );
76
+ lcd = lcd_mem_rgba8888_create_double_fb (w , h , online_fb , s_offline_fb );
77
+ }
78
+ } else if (bpp == 24 ) {
79
+ assert (!"not supported framebuffer format." );
80
+ } else {
81
+ assert (!"not supported framebuffer format." );
82
+ }
83
+
84
+ lcd_mem_set_line_length (lcd , line_length );
85
+
86
+ return lcd ;
87
+ }
88
+
141
89
lcd_t * lcd_linux_fb_create (const char * filename ) {
142
90
lcd_t * lcd = NULL ;
143
91
fb_info_t * fb = & s_fb ;
144
92
return_value_if_fail (filename != NULL , NULL );
145
93
146
94
if (fb_open (fb , filename ) == 0 ) {
147
- int w = fb_width (fb );
148
- int h = fb_height (fb );
149
- int line_length = fb -> fix .line_length ;
150
-
151
- int size = fb_size (fb );
152
- int bpp = fb -> var .bits_per_pixel ;
153
- uint8_t * online_fb = (uint8_t * )(fb -> bits );
154
-
155
- s_offline_fb = (uint8_t * )malloc (size );
156
- if (s_offline_fb == NULL ) {
157
- fb_close (fb );
158
-
159
- return NULL ;
160
- }
161
-
162
- if (bpp == 16 ) {
163
- lcd = lcd_mem_bgr565_create_double_fb (w , h , online_fb , s_offline_fb );
164
- } else if (bpp == 32 ) {
165
- if (fb -> var .blue .offset == 0 ) {
166
- lcd = lcd_mem_bgra8888_create_double_fb (w , h , online_fb , s_offline_fb );
167
- } else {
168
- lcd = lcd_mem_rgba8888_create_double_fb (w , h , online_fb , s_offline_fb );
169
- }
170
- } else if (bpp == 24 ) {
171
- assert (!"not supported framebuffer format." );
172
- } else {
173
- assert (!"not supported framebuffer format." );
174
- }
175
-
176
- lcd_mem_set_line_length (lcd , line_length );
95
+ lcd = lcd_linux_create (fb );
177
96
}
178
97
179
98
if (lcd != NULL ) {
0 commit comments