Update argument passing, add video resume
This commit is contained in:
@@ -1462,6 +1462,86 @@ static void *video_logo (void)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
int video_resume(void *videobase, int row, int col) {
|
||||
unsigned char color8;
|
||||
|
||||
video_fb_address = videobase;
|
||||
#ifdef CONFIG_VIDEO_HW_CURSOR
|
||||
video_init_hw_cursor (VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT);
|
||||
#endif
|
||||
|
||||
/* Init drawing pats */
|
||||
switch (CONFIG_VIDEO_DATA_FORMAT) {
|
||||
case GDF__8BIT_INDEX:
|
||||
video_set_lut (0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, CONSOLE_FG_COL);
|
||||
video_set_lut (0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, CONSOLE_BG_COL);
|
||||
fgx = 0x01010101;
|
||||
bgx = 0x00000000;
|
||||
break;
|
||||
case GDF__8BIT_332RGB:
|
||||
color8 = ((CONSOLE_FG_COL & 0xe0) |
|
||||
((CONSOLE_FG_COL >> 3) & 0x1c) | CONSOLE_FG_COL >> 6);
|
||||
fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8;
|
||||
color8 = ((CONSOLE_BG_COL & 0xe0) |
|
||||
((CONSOLE_BG_COL >> 3) & 0x1c) | CONSOLE_BG_COL >> 6);
|
||||
bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8;
|
||||
break;
|
||||
case GDF_15BIT_555RGB:
|
||||
fgx = (((CONSOLE_FG_COL >> 3) << 26) |
|
||||
((CONSOLE_FG_COL >> 3) << 21) | ((CONSOLE_FG_COL >> 3) << 16) |
|
||||
((CONSOLE_FG_COL >> 3) << 10) | ((CONSOLE_FG_COL >> 3) << 5) |
|
||||
(CONSOLE_FG_COL >> 3));
|
||||
bgx = (((CONSOLE_BG_COL >> 3) << 26) |
|
||||
((CONSOLE_BG_COL >> 3) << 21) | ((CONSOLE_BG_COL >> 3) << 16) |
|
||||
((CONSOLE_BG_COL >> 3) << 10) | ((CONSOLE_BG_COL >> 3) << 5) |
|
||||
(CONSOLE_BG_COL >> 3));
|
||||
break;
|
||||
case GDF_16BIT_565RGB:
|
||||
fgx = (((CONSOLE_FG_COL >> 3) << 27) |
|
||||
((CONSOLE_FG_COL >> 2) << 21) | ((CONSOLE_FG_COL >> 3) << 16) |
|
||||
((CONSOLE_FG_COL >> 3) << 11) | ((CONSOLE_FG_COL >> 2) << 5) |
|
||||
(CONSOLE_FG_COL >> 3));
|
||||
bgx = (((CONSOLE_BG_COL >> 3) << 27) |
|
||||
((CONSOLE_BG_COL >> 2) << 21) | ((CONSOLE_BG_COL >> 3) << 16) |
|
||||
((CONSOLE_BG_COL >> 3) << 11) | ((CONSOLE_BG_COL >> 2) << 5) |
|
||||
(CONSOLE_BG_COL >> 3));
|
||||
break;
|
||||
case GDF_32BIT_X888RGB:
|
||||
fgx = (CONSOLE_FG_COL << 16) | (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL;
|
||||
bgx = (CONSOLE_BG_COL << 16) | (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL;
|
||||
break;
|
||||
case GDF_24BIT_888RGB:
|
||||
fgx = (CONSOLE_FG_COL << 24) | (CONSOLE_FG_COL << 16) |
|
||||
(CONSOLE_FG_COL << 8) | CONSOLE_FG_COL;
|
||||
bgx = (CONSOLE_BG_COL << 24) | (CONSOLE_BG_COL << 16) |
|
||||
(CONSOLE_BG_COL << 8) | CONSOLE_BG_COL;
|
||||
break;
|
||||
}
|
||||
eorx = fgx ^ bgx;
|
||||
|
||||
#ifdef CONFIG_VIDEO_LOGO
|
||||
/* Plot the logo and get start point of console */
|
||||
PRINTD ("Video: Drawing the logo ...\n");
|
||||
video_console_address = video_logo ();
|
||||
#else
|
||||
video_console_address = video_fb_address;
|
||||
#endif
|
||||
|
||||
/* Initialize the console */
|
||||
console_col = col;
|
||||
console_row = row;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int video_get_col(void) {
|
||||
return console_col;
|
||||
}
|
||||
|
||||
int video_get_row(void) {
|
||||
return console_row;
|
||||
}
|
||||
|
||||
int video_init (void *videobase)
|
||||
{
|
||||
unsigned char color8;
|
||||
|
||||
@@ -47,7 +47,11 @@
|
||||
#define CONFIG_VIDEO_PIXEL_SIZE 4
|
||||
#define CONFIG_VIDEO_DATA_FORMAT GDF_32BIT_X888RGB /* BGR actually, but w/e */
|
||||
|
||||
int video_get_col(void);
|
||||
int video_get_row(void);
|
||||
|
||||
int video_init(void *fb);
|
||||
int video_resume(void *fb, int row, int col);
|
||||
void video_puts(const char *s);
|
||||
|
||||
#endif /*_VIDEO_FB_H_ */
|
||||
|
||||
@@ -11,8 +11,9 @@
|
||||
|
||||
int main(int argc, void **argv) {
|
||||
entrypoint_t entrypoint;
|
||||
stage2_args_t *args;
|
||||
|
||||
if (argc != STAGE2_ARGC || *((u32 *)argv[STAGE2_ARGV_VERSION]) != 0) {
|
||||
if (argc != STAGE2_ARGC || ((args = (stage2_args_t *)argv[STAGE2_ARGV_ARGUMENT_STRUCT])->version != 0)) {
|
||||
generic_panic();
|
||||
}
|
||||
|
||||
@@ -20,12 +21,13 @@ int main(int argc, void **argv) {
|
||||
|
||||
/* Setup LFB. */
|
||||
/* TODO: How can we keep the console line/offset to resume printing? */
|
||||
video_init((u32 *)argv[STAGE2_ARGV_LFB]);
|
||||
video_resume(args->lfb, args->console_row, args->console_col);
|
||||
|
||||
printk("Welcome to Atmosph\xe8re Fus\xe9" "e Stage 2!\n");
|
||||
printk("Stage 2 executing from: %s\n", (const char *)argv[STAGE2_ARGV_PROGRAM_PATH]);
|
||||
|
||||
/* This will load all remaining binaries off of the SD. */
|
||||
entrypoint = load_payload((const char *)argv[STAGE2_ARGV_CONFIG]);
|
||||
entrypoint = load_payload(args->bct0);
|
||||
|
||||
/* TODO: What do we want to do in terms of argc/argv? */
|
||||
entrypoint(0, NULL);
|
||||
|
||||
@@ -4,9 +4,16 @@
|
||||
#include "utils.h"
|
||||
|
||||
/* TODO: Is there a more concise way to do this? */
|
||||
#define STAGE2_ARGV_VERSION 0
|
||||
#define STAGE2_ARGV_CONFIG 1
|
||||
#define STAGE2_ARGV_LFB 2
|
||||
#define STAGE2_ARGC 3
|
||||
#define STAGE2_ARGV_PROGRAM_PATH 0
|
||||
#define STAGE2_ARGV_ARGUMENT_STRUCT 1
|
||||
#define STAGE2_ARGC 2
|
||||
|
||||
typedef struct {
|
||||
uint32_t version;
|
||||
const char *bct0;
|
||||
uint32_t *lfb;
|
||||
uint32_t console_row;
|
||||
uint32_t console_col;
|
||||
} stage2_args_t;
|
||||
|
||||
#endif
|
||||
@@ -69,9 +69,9 @@ static inline bool check_32bit_additive_overflow(uint32_t a, uint32_t b) {
|
||||
return __builtin_add_overflow_p(a, b, (uint32_t)0);
|
||||
}
|
||||
|
||||
void panic(uint32_t code);
|
||||
void generic_panic(void);
|
||||
void panic_predefined(uint32_t which);
|
||||
__attribute__ ((noreturn)) void panic(uint32_t code);
|
||||
__attribute__ ((noreturn)) void generic_panic(void);
|
||||
__attribute__ ((noreturn)) void panic_predefined(uint32_t which);
|
||||
bool overlaps(uint64_t as, uint64_t ae, uint64_t bs, uint64_t be);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user