Skip to content

Commit abffb5b

Browse files
committed
add lcd_mem_others
1 parent c485d1a commit abffb5b

13 files changed

+269
-134
lines changed

.clang-format

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ PenaltyExcessCharacter: 1000000
9292
PenaltyReturnTypeOnItsOwnLine: 200
9393
PointerAlignment: Left
9494
RawStringFormats:
95-
- Delimiter: pb
96-
Language: TextProto
95+
- Language: TextProto
9796
BasedOnStyle: google
9897
ReflowComments: true
9998
SortIncludes: false

awtk-port/fb_info.h

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/**
2+
* File: lcd_linux_fb.h
3+
* Author: AWTK Develop Team
4+
* Brief: linux framebuffer lcd
5+
*
6+
* Copyright (c) 2018 - 2018 Guangzhou ZHIYUAN Electronics Co.,Ltd.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* License file for more details.
12+
*
13+
*/
14+
15+
/**
16+
* History:
17+
* ================================================================
18+
* 2018-09-07 Li XianJing <[email protected]> created
19+
*
20+
*/
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"
33+
#include "tkc/mem.h"
34+
35+
#ifndef TK_FB_INFO_H
36+
#define TK_FB_INFO_H
37+
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 inline 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 inline 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 inline 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+
#endif /*TK_FB_INFO_H*/

awtk-port/input_thread.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ static run_info_t* info_dup(run_info_t* info) {
250250
}
251251

252252
tk_thread_t* input_thread_run(const char* filename, input_dispatch_t dispatch, void* ctx,
253-
int32_t max_x, int32_t max_y) {
253+
int32_t max_x, int32_t max_y) {
254254
run_info_t info;
255255
tk_thread_t* thread = NULL;
256256
return_value_if_fail(filename != NULL && dispatch != NULL, NULL);

awtk-port/input_thread.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
BEGIN_C_DECLS
2929

3030
tk_thread_t* input_thread_run(const char* filename, input_dispatch_t dispatch, void* ctx,
31-
int32_t max_x, int32_t max_y);
31+
int32_t max_x, int32_t max_y);
3232

3333
END_C_DECLS
3434

awtk-port/lcd_linux_fb.c

Lines changed: 42 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -19,104 +19,14 @@
1919
*
2020
*/
2121

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"
3323
#include "tkc/mem.h"
24+
#include "base/lcd.h"
25+
#include "lcd_mem_others.h"
3426
#include "lcd/lcd_mem_bgr565.h"
3527
#include "lcd/lcd_mem_bgra8888.h"
3628
#include "lcd/lcd_mem_rgba8888.h"
3729

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-
12030
static fb_info_t s_fb;
12131
static lcd_flush_t s_lcd_flush_default = NULL;
12232

@@ -138,42 +48,51 @@ static void on_app_exit(void) {
13848
fb_close(fb);
13949
}
14050

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+
14189
lcd_t* lcd_linux_fb_create(const char* filename) {
14290
lcd_t* lcd = NULL;
14391
fb_info_t* fb = &s_fb;
14492
return_value_if_fail(filename != NULL, NULL);
14593

14694
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);
17796
}
17897

17998
if (lcd != NULL) {

0 commit comments

Comments
 (0)