lib: simplefb: Add support for RGB888 24bpp (dependant on the stride)

Also comes with small changes here and there.

Signed-off-by: Ivaylo Ivanov <ivo.ivanov.ivanov1@gmail.com>
This commit is contained in:
Ivaylo Ivanov 2023-07-19 22:48:06 +03:00
parent a1be36ae02
commit ed246836e9
6 changed files with 21 additions and 59 deletions

View File

@ -117,6 +117,6 @@ menu "Device Specific Addresses"
default 4 if SAMSUNG_DREAMLTE default 4 if SAMSUNG_DREAMLTE
default 4 if SAMSUNG_STARLTE default 4 if SAMSUNG_STARLTE
default 4 if SAMSUNG_X1S default 4 if SAMSUNG_X1S
default 4 if SAMSUNG_J5LTE default 3 if SAMSUNG_J5LTE
endmenu endmenu

View File

@ -9,9 +9,10 @@
#define SIMPLEFB_H_ #define SIMPLEFB_H_
typedef struct _color { typedef struct _color {
int r; unsigned char a;
int g; unsigned char r;
int b; unsigned char g;
unsigned char b;
} color; } color;
typedef struct _font_params { typedef struct _font_params {
@ -21,15 +22,4 @@ typedef struct _font_params {
font_params get_font_params(void); font_params get_font_params(void);
long unsigned int strlen(const char *p) {
unsigned int i = 0;
while(*p != '\0') {
i++;
p++;
}
return i;
}
#endif #endif

View File

@ -17,13 +17,5 @@ extern void clean_fb(volatile char *fb, int width, int height, int stride);
extern void printk(char *text); extern void printk(char *text);
extern void writel(unsigned int value, void* address); extern void writel(unsigned int value, void* address);
#ifdef __aarch64__
/* Define our own 128 bit memcpy */
extern void memcpy(void *dest, void *src, size_t size);
#endif
#ifdef __arm__
extern void memcpy (char* src, char* dest, size_t len);
#endif
#endif // MAIN_H_ #endif // MAIN_H_

View File

@ -26,22 +26,3 @@ void printk(char *text) {
debug_linecount++; debug_linecount++;
#endif #endif
} }
/*
#ifdef __aarch64__
Define our own 128 bit memcpy *
void memcpy(void *dest, void *src, size_t size)
{
unsigned __int128 *src2 = src;
unsigned __int128 *dest2 = dest;
for (size_t i = 0; i < size / 16; i++)
dest2[i] = src2[i];
}
#endif
#ifdef __arm__
void memcpy (char* src, char* dest, size_t len) {
for (size_t i = 0; i < len; i++)
dest[i] = src[i];
}
#endif*/

View File

@ -7,29 +7,34 @@
#include <lib/simplefb.h> #include <lib/simplefb.h>
#include <lib/font.h> #include <lib/font.h>
#include <string.h>
void clean_fb(volatile char *fb, int width, int height, int stride) { void clean_fb(volatile char *fb, int width, int height, int stride) {
for (volatile char *addr = fb; addr < fb + (width * height * stride); addr += stride) for (volatile char *addr = fb; addr < fb + (width * height * stride); addr += stride)
*(int*) (addr) = 0x0; *(int*)(addr) = 0x0;
} }
void draw_pixel(volatile char *fb, int x, int y, int width, int stride) { /* RGB888 format */
/* Unlike ARGB8888, we explicitly use 3 bytes to represent each pixel, making sure no extra padding byte is added. */
void draw_pixel(volatile char *fb, int x, int y, int width, int stride, color c) {
long int location = (x * stride) + (y * width * stride); long int location = (x * stride) + (y * width * stride);
*(fb + location) = 255; // Blue *(fb + location) = c.r;
*(fb + location + 1) = 255; // Green *(fb + location + 1) = c.g;
*(fb + location + 2) = 255; // Red *(fb + location + 2) = c.b;
*(fb + location + 3) = 255; // Full opacity #if CONFIG_FRAMEBUFFER_STRIDE == 4
*(fb + location + 3) = c.a;
#endif
} }
void draw_horizontal_line(volatile char *fb, int x1, int x2, int y, color c, int width, int stride) { void draw_horizontal_line(volatile char *fb, int x1, int x2, int y, color c, int width, int stride) {
for (int i = x1; i < x2; i++) for (int i = x1; i < x2; i++)
draw_pixel(fb, i, y, width, stride); draw_pixel(fb, i, y, width, stride, c);
} }
void draw_vertical_line(volatile char *fb, int x, int y1, int y2, color c, int width, int stride) { void draw_vertical_line(volatile char *fb, int x, int y1, int y2, color c, int width, int stride) {
for (int i = y1; i < y2; i++) for (int i = y1; i < y2; i++)
draw_pixel(fb, x, i, width, stride); draw_pixel(fb, x, i, width, stride, c);
} }
void draw_filled_rectangle(volatile char *fb, int x1, int y1, int w, int h, color c, int width, int stride) { void draw_filled_rectangle(volatile char *fb, int x1, int y1, int w, int h, color c, int width, int stride) {
@ -42,7 +47,7 @@ void draw_text(volatile char *fb, char *text, int textX, int textY, int width, i
int l = strlen(text); int l = strlen(text);
for (int i = 0; i < l; i++) { for (int i = 0; i < l; i++) {
if(text[i] < 32) if (text[i] < 32)
continue; continue;
int ix = font_index(text[i]); int ix = font_index(text[i]);
@ -53,15 +58,8 @@ void draw_text(volatile char *fb, char *text, int textX, int textY, int width, i
for (int x = 0; x < FONTW; x++) { for (int x = 0; x < FONTW; x++) {
if (((b << x) & 0b10000000) > 0) if (((b << x) & 0b10000000) > 0)
draw_pixel(fb, textX + i * FONTW + x, textY + y, width, stride); draw_pixel(fb, textX + i * FONTW + x, textY + y, width, stride, (color){255, 255, 255});
} }
} }
} }
} }
/* Helper functions */
font_params get_font_params() {
font_params params = {.width=FONTW, .height=FONTH};
return params;
}

View File

@ -4,6 +4,7 @@
*/ */
#include <main.h> #include <main.h>
#include <string.h>
void main(void* dt, void* kernel) { void main(void* dt, void* kernel) {
/* Initialize SoC and Board specific peripherals/quirks */ /* Initialize SoC and Board specific peripherals/quirks */