diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-03 21:13:00 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-03 21:13:00 +0200 |
commit | d7609640e7cb9d213b9d3cbcf9394c677719d369 (patch) | |
tree | 1487faa310e5f6dd91a5d033644abb470b8f3719 /arch/sandbox | |
parent | d1e65d2a7bd9162e7009da870adb15c70b620320 (diff) | |
parent | 9d73b518fc3c61640123f8499aab7f8373e41dbd (diff) | |
download | barebox-d7609640e7cb9d213b9d3cbcf9394c677719d369.tar.gz barebox-d7609640e7cb9d213b9d3cbcf9394c677719d369.tar.xz |
Merge branch 'for-next/sandbox'
Conflicts:
arch/sandbox/mach-sandbox/include/mach/linux.h
Diffstat (limited to 'arch/sandbox')
-rw-r--r-- | arch/sandbox/Kconfig | 3 | ||||
-rw-r--r-- | arch/sandbox/Makefile | 6 | ||||
-rw-r--r-- | arch/sandbox/board/board.c | 21 | ||||
-rw-r--r-- | arch/sandbox/include/asm/posix_types.h | 14 | ||||
-rw-r--r-- | arch/sandbox/include/asm/unaligned.h | 2 | ||||
-rw-r--r-- | arch/sandbox/mach-sandbox/include/mach/linux.h | 14 | ||||
-rw-r--r-- | arch/sandbox/os/Makefile | 2 | ||||
-rw-r--r-- | arch/sandbox/os/common.c | 33 | ||||
-rw-r--r-- | arch/sandbox/os/sdl.c | 108 |
9 files changed, 196 insertions, 7 deletions
diff --git a/arch/sandbox/Kconfig b/arch/sandbox/Kconfig index 10e682976a..84fadda3ce 100644 --- a/arch/sandbox/Kconfig +++ b/arch/sandbox/Kconfig @@ -1,3 +1,6 @@ +config SANDBOX + bool + default y config ARCH_TEXT_BASE hex diff --git a/arch/sandbox/Makefile b/arch/sandbox/Makefile index 9fd18a23b5..c0aa8c6ed2 100644 --- a/arch/sandbox/Makefile +++ b/arch/sandbox/Makefile @@ -9,8 +9,7 @@ lds-y := $(BOARD)/barebox.lds TEXT_BASE = $(CONFIG_TEXT_BASE) - -CFLAGS += -Dmalloc=barebox_malloc \ +CFLAGS += -Dmalloc=barebox_malloc -Dcalloc=barebox_calloc \ -Dfree=barebox_free -Drealloc=barebox_realloc \ -Dread=barebox_read -Dwrite=barebox_write \ -Dopen=barebox_open -Dclose=barebox_close \ @@ -40,9 +39,10 @@ archprepare: maketools PHONY += maketools +SDL_LIBS-$(CONFIG_DRIVER_VIDEO_SDL) := $(shell pkg-config sdl --libs) cmd_barebox__ = $(CC) -o $@ -Wl,-T,$(barebox-lds) \ -Wl,--start-group $(barebox-common) -Wl,--end-group \ - -lrt -lpthread + -lrt -lpthread $(SDL_LIBS-y) common-y += $(BOARD) arch/sandbox/os/ diff --git a/arch/sandbox/board/board.c b/arch/sandbox/board/board.c index 5d4f5e042d..91fe9bdbc5 100644 --- a/arch/sandbox/board/board.c +++ b/arch/sandbox/board/board.c @@ -23,16 +23,37 @@ #include <mach/linux.h> #include <init.h> #include <errno.h> +#include <fb.h> + +struct fb_videomode mode = { + .name = "sdl", /* optional */ + .xres = 640, + .yres = 480, +}; static struct device_d tap_device = { .id = DEVICE_ID_DYNAMIC, .name = "tap", }; +static struct device_d sdl_device = { + .id = DEVICE_ID_DYNAMIC, + .name = "sdlfb", + .platform_data = &mode, +}; + static int devices_init(void) { register_device(&tap_device); + if (sdl_xres) + mode.xres = sdl_xres; + + if (sdl_yres) + mode.yres = sdl_yres; + + register_device(&sdl_device); + return 0; } diff --git a/arch/sandbox/include/asm/posix_types.h b/arch/sandbox/include/asm/posix_types.h index 4345141d29..6985b8eb4a 100644 --- a/arch/sandbox/include/asm/posix_types.h +++ b/arch/sandbox/include/asm/posix_types.h @@ -15,9 +15,23 @@ typedef int __kernel_pid_t; typedef unsigned short __kernel_ipc_pid_t; typedef unsigned short __kernel_uid_t; typedef unsigned short __kernel_gid_t; +/* + * Most 32 bit architectures use "unsigned int" size_t, + * and all 64 bit architectures use "unsigned long" size_t. + * + * TODO: It's not clean to use __x86_64__ here. It's better + * to check on __BITS_PER_LONG here. But this is wrong set in + * arch/sandbox/include/asm/types.h. + */ +#ifdef __x86_64__ typedef unsigned long __kernel_size_t; typedef long __kernel_ssize_t; +typedef long __kernel_ptrdiff_t; +#else +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; typedef int __kernel_ptrdiff_t; +#endif typedef long __kernel_time_t; typedef long __kernel_suseconds_t; typedef long __kernel_clock_t; diff --git a/arch/sandbox/include/asm/unaligned.h b/arch/sandbox/include/asm/unaligned.h index 07c1ae4dcd..d02da6e60d 100644 --- a/arch/sandbox/include/asm/unaligned.h +++ b/arch/sandbox/include/asm/unaligned.h @@ -8,7 +8,7 @@ #include <linux/unaligned/access_ok.h> #include <linux/unaligned/generic.h> -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#if __BYTE_ORDER == __LITTLE_ENDIAN #define get_unaligned __get_unaligned_le #define put_unaligned __put_unaligned_le #else diff --git a/arch/sandbox/mach-sandbox/include/mach/linux.h b/arch/sandbox/mach-sandbox/include/mach/linux.h index 259f2d8ee3..50d2721f77 100644 --- a/arch/sandbox/mach-sandbox/include/mach/linux.h +++ b/arch/sandbox/mach-sandbox/include/mach/linux.h @@ -4,6 +4,9 @@ struct device_d; int sandbox_add_device(struct device_d *dev); + +struct fb_bitfield; + int linux_register_device(const char *name, void *start, void *end); int tap_alloc(char *dev); uint64_t linux_get_time(void); @@ -23,4 +26,15 @@ struct linux_console_data { unsigned int flags; }; +extern int sdl_xres; +extern int sdl_yres; +int sdl_init(void); +void sdl_close(void); +int sdl_open(int xres, int yres, int bpp, void* buf); +void sdl_stop_timer(void); +void sdl_start_timer(void); +void sdl_get_bitfield_rgba(struct fb_bitfield *r, struct fb_bitfield *g, + struct fb_bitfield *b, struct fb_bitfield *a); +void sdl_setpixel(int x, int y, uint8_t r, uint8_t g, uint8_t b, uint8_t a); + #endif /* __ASM_ARCH_LINUX_H */ diff --git a/arch/sandbox/os/Makefile b/arch/sandbox/os/Makefile index dc211d94cd..2e65be5eed 100644 --- a/arch/sandbox/os/Makefile +++ b/arch/sandbox/os/Makefile @@ -13,3 +13,5 @@ NOSTDINC_FLAGS := obj-y = common.o tap.o +CFLAGS_sdl.o = $(shell pkg-config sdl --cflags) +obj-$(CONFIG_DRIVER_VIDEO_SDL) += sdl.o diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c index 0a4b96a63e..0dedfe19f4 100644 --- a/arch/sandbox/os/common.c +++ b/arch/sandbox/os/common.c @@ -49,6 +49,9 @@ #include <mach/linux.h> #include <mach/hostfile.h> +int sdl_xres; +int sdl_yres; + static struct termios term_orig, term_vi; static char erase_char; /* the users erase character */ @@ -275,10 +278,12 @@ static struct option long_options[] = { {"env", 1, 0, 'e'}, {"stdout", 1, 0, 'O'}, {"stdin", 1, 0, 'I'}, + {"xres", 1, 0, 'x'}, + {"yres", 1, 0, 'y'}, {0, 0, 0, 0}, }; -static const char optstring[] = "hm:i:e:O:I:"; +static const char optstring[] = "hm:i:e:O:I:x:y:"; int main(int argc, char *argv[]) { @@ -303,6 +308,8 @@ int main(int argc, char *argv[]) case 'm': malloc_size = strtoul(optarg, NULL, 0); break; + case 'i': + break; case 'e': sprintf(str, "env%d", envno); ret = add_image(optarg, str); @@ -328,6 +335,12 @@ int main(int argc, char *argv[]) barebox_register_console("cin", fd, -1); break; + case 'x': + sdl_xres = strtoul(optarg, NULL, 0); + break; + case 'y': + sdl_yres = strtoul(optarg, NULL, 0); + break; default: exit(1); } @@ -340,7 +353,11 @@ int main(int argc, char *argv[]) } mem_malloc_init(ram, ram + malloc_size - 1); - /* reset getopt */ + /* + * Reset getopt. + * We need to run a second getopt to count -i parameters. + * This is for /dev/fd# devices. + */ optind = 1; while (1) { @@ -396,7 +413,9 @@ static void print_usage(const char *prgname) " -O, --stdout=<file> Register a file as a console capable of doing stdout.\n" " <file> can be a regular file or a FIFO.\n" " -I, --stdin=<file> Register a file as a console capable of doing stdin.\n" -" <file> can be a regular file or a FIFO.\n", +" <file> can be a regular file or a FIFO.\n" +" -x, --xres=<res> SDL width.\n" +" -y, --yres=<res> SDL height.\n", prgname ); } @@ -436,6 +455,14 @@ static void print_usage(const char *prgname) * Register \<file\> as a console capable of doing stdin. \<file\> can be a regular * file or a fifo. * + * -x, --xres \<res\> + * + * Specify SDL width + * + * -y, --yres \<res\> + * + * Specify SDL height + * * @section simu_dbg How to debug barebox simulator * */ diff --git a/arch/sandbox/os/sdl.c b/arch/sandbox/os/sdl.c new file mode 100644 index 0000000000..ec538e9af9 --- /dev/null +++ b/arch/sandbox/os/sdl.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * GPL v2 + */ + +#include <stdio.h> +#include <SDL.h> +#include <time.h> +#include <signal.h> +#include <mach/linux.h> +#include <unistd.h> +#include <pthread.h> + +struct fb_bitfield { + uint32_t offset; /* beginning of bitfield */ + uint32_t length; /* length of bitfield */ + uint32_t msb_right; /* != 0 : Most significant bit is */ + /* right */ +}; + +static SDL_Surface *real_screen; +static void *buffer = NULL; +pthread_t th; + +int sdl_init(void) +{ + return SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); +} + +static void sdl_copy_buffer(SDL_Surface *screen) +{ + if (SDL_MUSTLOCK(screen)) { + if (SDL_LockSurface(screen) < 0) + return; + } + + memcpy(screen->pixels, buffer, screen->pitch * screen->h); + + if(SDL_MUSTLOCK(screen)) + SDL_UnlockSurface(screen); +} + +static void *threadStart(void *ptr) +{ + while (1) { + usleep(1000 * 100); + + sdl_copy_buffer(real_screen); + SDL_Flip(real_screen); + } + + return 0; +} + +void sdl_start_timer(void) +{ + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_create(&th, &attr, threadStart, NULL); +} + +void sdl_stop_timer(void) +{ + pthread_cancel(th); +} + +void sdl_get_bitfield_rgba(struct fb_bitfield *r, struct fb_bitfield *g, + struct fb_bitfield *b, struct fb_bitfield *a) +{ + SDL_Surface *screen = real_screen; + + r->length = 8 - screen->format->Rloss; + r->offset = screen->format->Rshift; + g->length = 8 - screen->format->Gloss; + g->offset = screen->format->Gshift; + b->length = 8 - screen->format->Bloss; + b->offset = screen->format->Bshift; + a->length = 8 - screen->format->Aloss; + a->offset = screen->format->Ashift; +} + +int sdl_open(int xres, int yres, int bpp, void* buf) +{ + int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL; + + if (sdl_init() < 0) { + printf("Could not initialize SDL: %s.\n", SDL_GetError()); + return -1; + } + + real_screen = SDL_SetVideoMode(xres, yres, bpp, flags); + if (!real_screen) { + sdl_close(); + fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError()); + return -1; + } + + buffer = buf; + + return 0; +} + +void sdl_close(void) +{ + sdl_stop_timer(); + SDL_Quit(); +} |